Как рассчитать расстояние в Python - PullRequest
1 голос
/ 27 марта 2020

пусть сказал, что у меня есть два массива точек, и я хочу знать, каково расстояние между каждой точкой.

Например:

array_1 = [p1,p2,p3,p4]
array_2 = [p5,p6]

от p1 до p6 - это точка, что-то например, [1,1,1] (3D)

желаемый результат -

output = [[distance of p1 to p5, distance of p2 to p5, ... distance of p4 to p5], 
          [distance of p1 to p6, distance of p2 to p6, ... distance of p4 to p6]]

Какой наилучший подход, если я хочу использовать numpy?

Ответы [ 2 ]

2 голосов
/ 27 марта 2020

Вы можете сначала расположить два массива в форму m × 1 × 3 и 1 × n × 3 , а затем вычесть координаты:

delta = array_1[:,None] - array_2

Затем мы можем возвести в квадрат разницы в координатах и ​​вычислить сумму, затем мы можем вычислить квадратный маршрут:

distances = np.sqrt((delta*delta).sum(axis=2))

Теперь distances является m × n матрица с ij -ым элементом - расстоянием между i -ым элементом первого массива и j -ым элементом второго массива.

Например, если мы имеем в качестве данных:

>>> array_1 = np.arange(12).reshape(-1,3)
>>> array_2 = 2*np.arange(6).reshape(-1,3)

В результате получаем:

>>> delta = array_1[:,None] - array_2
>>> distances = np.sqrt((delta*delta).sum(axis=2))
>>> distances
array([[ 2.23606798, 12.20655562],
       [ 3.74165739,  7.07106781],
       [ 8.77496439,  2.23606798],
       [13.92838828,  3.74165739]])

Первый элемент array_1 имеет координаты (0,1,2 ), а вторая из array_2 имеет координаты (6,8,10). Следовательно, расстояние равно:

>>> np.sqrt(6*6 + 7*7 + 8*8)
12.206555615733702

Это то, что мы видим в массиве distances для distances[0,1].

Вышеприведенный метод функции может вычислить Евклидово расстояние для произвольного количества измерений. Учитывая, что как array_1, так и array_2 имеют точки с одинаковым количеством измерений (1D, 2D, 3D и т. Д. c.), Можно рассчитать расстояния между точками.

2 голосов
/ 27 марта 2020

Этот ответ не предназначен специально для numpy массивов, но его можно легко расширить, чтобы включить их. Модуль itertools.product - ваш друг здесь.

# Fill this with your formula for distance
def calculate_distance(point_1, point_2):
    distance = ...
    return distance

# The itertools module helps here
import itertools
array_1, array_2 = [p1, p2, p3, p4], [p5, p6]

# Initialise list to store answers
distances = []

# Iterate over every combination and calculate distance
for i, j in itertools.product(array_1, array_2):
    distances.append(calculate_distance(i, j)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...