В 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]])