вычисление евклидова расстояния numy для Python между матрицами векторов строк - PullRequest
18 голосов
/ 07 декабря 2010

Я новичок в Numpy и хотел бы спросить вас, как рассчитать евклидово расстояние между точками, хранящимися в векторе.

Давайте предположим, что у нас есть numpy.array, каждая строка является вектором и одним numpy.array. Я хотел бы знать, возможно ли рассчитать евклидово расстояние между всеми точками и этой единственной точкой и сохранить их в одном numpy.array.

Вот интерфейс:

points #2d list of row-vectors
singlePoint #one row-vector

listOfDistances= procedure( points,singlePoint)

Можем ли мы что-нибудь подобное? Или можно иметь одну команду, чтобы в качестве списка других точек была единственная точка, и в конце мы получили матрицу расстояний?

Спасибо

Ответы [ 5 ]

16 голосов
/ 07 декабря 2010

Хотя вы можете использовать векторизацию, подход @ Karl будет довольно медленным с массивными массивами.

Более простой подход - просто сделать 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)
5 голосов
/ 16 августа 2016

Чтобы получить расстояние, вы можете использовать метод нормы модуля linalg в numpy:

np.linalg.norm(x - y)
5 голосов
/ 26 января 2016
import numpy as np
def distance(v1, v2):
    return np.sqrt(np.sum((v1 - v2) ** 2))    
2 голосов
/ 07 декабря 2010

Чтобы применить функцию к каждому элементу массива numpy, попробуйте numpy.vectorize .

Для фактического расчета нам нужен квадратный корень из суммы квадратов разностей (вот так!) Между парами координат в двух векторах.

Мы можем использовать zip для сопряжения координат и sum с пониманием для подведения итогов. Это выглядит так:

sum((x - y) ** 2 for (x, y) in zip(singlePoint, pointFromArray)) ** 0.5
0 голосов
/ 23 июля 2018
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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...