Вы можете сначала расположить два массива в форму 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.), Можно рассчитать расстояния между точками.