расчет евклидова расстояния 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)

import numpy as np
def distance(v1, v2):
    return np.sqrt(np.sum((v1 - v2) ** 2))    

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