Расчет расстояния между эйклидовыми числами python numpy между матрицами векторных векторов
Я новичок в Numpy, и я хотел бы спросить вас, как вычислить эвклидовое расстояние между точками, хранящимися в векторе.
Предположим, что у нас есть numpy.array, каждая строка - это вектор и один numpy.array. Я хотел бы знать, можно ли вычислить эвклидовое расстояние между всеми точками и этой единственной точкой и сохранить их в одном numpy.array.
Вот интерфейс:
points #2d list of row-vectors
singlePoint #one row-vector
listOfDistances= procedure( points,singlePoint)
Есть ли у нас что-то вроде этого?
Или возможно ли, чтобы одна команда имела единственную точку в виде списка других точек, а в конце мы получаем матрицу расстояний?
Спасибо
Ответы
Ответ 1
Хотя вы можете использовать vectorize, подход @Karl будет довольно медленным с массивами numpy.
Более простой подход - просто сделать np.hypot(*(points - single_point).T)
. (Transpose предполагает, что точки представляют собой массив 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)
Ответ 2
import numpy as np
def distance(v1, v2):
return np.sqrt(np.sum((v1 - v2) ** 2))
Ответ 3
Чтобы применить функцию к каждому элементу массива numpy, попробуйте numpy.vectorize.
Чтобы выполнить фактический расчет, нам нужен квадратный корень из суммы квадратов разностей (ww!) между парами координат в двух векторах.
Мы можем использовать zip
для сопряжения координат и sum
с пониманием для подведения итогов. Это выглядит так:
sum((x - y) ** 2 for (x, y) in zip(singlePoint, pointFromArray)) ** 0.5
Ответ 4
Чтобы получить расстояние, вы можете использовать нормальный метод модуля linalg в numpy:
np.linalg.norm(x - y)