расчет евклидова расстояния python numpy между матрицами векторов строк
Я новичок в numpy и я хотел бы спросить вас, как вычислить евклидово расстояние между точками, хранящихся в векторе.
предположим, что у нас есть numpy.массив каждая строка представляет собой вектор и один numpy.матрица. Я хотел бы знать, можно ли вычислить евклидово расстояние между всеми точками и этой единственной точкой и сохранить их в одном numpy.матрица.
интерфейс:
points #2d list of row-vectors
singlePoint #one row-vector
listOfDistances= procedure( points,singlePoint)
мы можем иметь что-то подобное? Или это возможно ли иметь одну команду, чтобы иметь одну точку в качестве списка других точек, и в конце мы получаем матрицу расстояний?
спасибо
5 ответов
хотя вы можете использовать vectorize, подход @Karl будет довольно медленным с массивами numpy.
более простой подход-просто сделать np.hypot(*(points - single_point).T)
. (Транспонирование предполагает, что точки являются массивом Nx2, а не 2xn. Если это 2xN, вам не нужно .T
.
однако это немного нечитабельно, поэтому вы пишете его более ясно, как это (используя некоторые консервированные данные примера...):
import numpy as np
single_point = [3, 4]
points = np.arange(20).reshape((10,2))
dist = (points - single_point)**2
dist = np.sum(dist, axis=1)
dist = np.sqrt(dist)
чтобы получить расстояние, вы можете использовать метод norm модуля linalg в numpy:
np.linalg.norm(x - y)
чтобы применить функцию к каждому элементу массива numpy, попробовать и NumPy.векторизировать.
чтобы сделать фактический расчет, нам нужен квадратный корень из суммы квадратов разностей (уфф!) между парами координат в двух векторах.
можно использовать zip
для сопряжения координат, а sum
С пониманием подводить итоги. Это выглядит так:
sum((x - y) ** 2 for (x, y) in zip(singlePoint, pointFromArray)) ** 0.5
import numpy as np
single_point = [3, 4]
points = np.arange(20).reshape((10,2))
distance = euclid_dist(single_point,points)
def euclid_dist(t1, t2):
return np.sqrt(((t1-t2)**2).sum(axis = 1))