web-dev-qa-db-ja.com

Python 2つの2Dポイントセット間のペアワイズ距離を計算するための代替手段

Matlabには、_pdist2_コマンドがあります。行列_mx2_と行列_nx2_が与えられると、行列の各行は_2d_ポイントを表します。ここで、_(i,j)_要素が_mx2_マトリックスのmxnthポイントから_nx2_マトリックスのithポイントまでの距離を表すようにjマトリックスを作成します。コマンドpdist2(M,N)を呼び出すだけです。

私はPythonでこれに代わるものを探しています。もちろん、2つのforループを書くこともできますが、2つのnumpy配列を使用しているため、forループを使用することが常に最良の選択であるとは限りません。 pythonユニバースにこれのために最適化されたコマンドはありますか?基本的に私はMATLABの_pdist2_の代わりにpythonを求めています。

5
user_1_1_1

cdist scipy関数を探しています。これは、n次元行列の2つのセット間のペアワイズ距離(デフォルトではユークリッド)を計算します。

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.        ]]
9
Duncan WP

_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
VMRuiz

マトリックスが大きすぎない場合、これは他のライブラリを使用せずに行う必要があります。マトリックスが大きい場合、この方法は少し遅くなり、メモリを大量に消費します。

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]])
0
Allen