Я рисую случайные точки на графике. Я хочу найти евсильдово расстояние от каждой точки до другой в списке.
Предыдущий результат/попытку можно посмотреть здесь
Я генерирую 4 случайных числа от 0 до 10 для координат x и y, а затем соединяю их с помощью np.array. Мне нужно использовать формулу расстояния и вложенный цикл для вычисления расстояния между двумя точками в списке. Это генерирует 8 значений, которые, как я предполагаю, являются расстояниями. Поскольку есть 4 точки, должно быть 6 расстояний между точками.
Я неправильно программирую дистанционную форумлу? Или я неправильно определяю точки?
Код ниже
import numpy as np
import matplotlib.pyplot as plt
import random
import math
dist = []
x = [random.uniform(1, 10) for n in range(4)]
y = [random.uniform(1, 10) for n in range(4)]
plt.scatter(x, y)
plt.show()
pairs = np.array([x, y])
def distance(x, y):
return math.sqrt((x[0]-x[1])**2 + (y[0]-y[1])**2)
for x in pairs:
for y in pairs:
d = distance(x, y)
dist.append(d)
print(pairs)
Вы можете попробовать приведенный ниже код, чтобы вычислить расстояние между каждой парой точек.
import random
import math
dist = []
x = [random.uniform(1, 10) for n in range(4)]
y = [random.uniform(1, 10) for n in range(4)]
pairs = list(zip(x,y))
def distance(x, y):
return math.sqrt((x[0]-x[1])**2 + (y[0]-y[1])**2)
for i in range(len(pairs)):
for j in range(i+1,len(pairs)):
dist.append(distance(pairs[i],pairs[j]))
print(dist)
Вы можете использовать трансляцию numpy для создания матрицы расстояний, где запись в (i,j)
— это расстояние от i-й точки до j-й точки. Старайтесь избегать циклов Python, если это возможно, поскольку они сравнительно медленные.
a = np.random.uniform(size=(4,2,1)) # coordinate of i-th point is a[i, :, 0]
np.sqrt(np.sum(np.square(a - a.T), axis=1))
циклы for при работе с пустыми матрицами - плохое решение. У @bui есть лучший ответ.