/ / Python алтернатива за изчисляване на двойното разстояние между два набора от 2d точки [дубликат] - python, алгоритъм, numpy, матрица, euclidean-distance

Python алтернатива за изчисляване на двойното разстояние между два набора от 2d точки [дубликат] - python, алгоритъм, numpy, матрица, euclidean-distance

В Matlab съществува pdist2 команда. Предвид матрицата mx2 и матрицата nx2, всеки ред от матрици представлява a 2d точка. Сега искам да създам a mxn матрица, така че (i,j) елемент представлява разстоянието от iточката от mx2 матрица към jточката от nx2 матрица. Аз просто се обаждам на командата pdist2(M,N).

Търся алтернатива на това в питона. Разбира се, мога да напиша 2 за бримки, но тъй като работя с 2 измамни масиви, използването на цикли не винаги е най-добрият избор. Има ли оптимизирана команда за това във вселената на питона? По принцип питам за Python алтернатива на MATLAB's pdist2.

Отговори:

5 за отговор № 1

Търсите cdist scipy функция. Той ще изчисли двойното разстояние (евклидея по подразбиране) между два набора от n-dimensional матрици.

from scipy.spatial.distance import cdist
import numpy as np

X = np.arange(10).reshape(-1,2)
Y = np.arange(10).reshape(-1,2)

cdist(X, Y)
[[  0.           2.82842712   5.65685425   8.48528137  11.3137085 ]
[  2.82842712   0.           2.82842712   5.65685425   8.48528137]
[  5.65685425   2.82842712   0.           2.82842712   5.65685425]
[  8.48528137   5.65685425   2.82842712   0.           2.82842712]
[ 11.3137085    8.48528137   5.65685425   2.82842712   0.        ]]

0 за отговор № 2

Трябва да проверите pairwise_distances метод на scikit-learn пакет.

sklearn.metrics.pairwise.pairwise_distances(X, Y=None, metric="euclidean", n_jobs=1, **kwds)

Повече информация в http://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.pairwise_distances.html


0 за отговор № 3

Ако вашата матрица не е твърде голяма, това трябва да се направи без да се използват други libs. Ако матрицата е голяма, този метод ще бъде малко бавен и памет интензивен.

mx2 = np.random.randint(1,9,5)
nx2 = np.random.randint(1,9,3)
mx2
Out[308]: array([2, 3, 4, 8, 7])
nx2
Out[309]: array([3, 2, 2])
mx2[:,None]-nx2
Out[310]:
array([[-1,  0,  0],
[ 0,  1,  1],
[ 1,  2,  2],
[ 5,  6,  6],
[ 4,  5,  5]])