Подтвердить что ты не робот

Расчет расстояния между эйклидовыми числами python numpy между матрицами векторных векторов

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

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

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

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

listOfDistances= procedure( points,singlePoint)

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

Спасибо

4b9b3361

Ответ 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)