Matlabには、_pdist2
_コマンドがあります。行列_mx2
_と行列_nx2
_が与えられると、行列の各行は_2d
_ポイントを表します。ここで、_(i,j)
_要素が_mx2
_マトリックスのmxn
thポイントから_nx2
_マトリックスのi
thポイントまでの距離を表すようにj
マトリックスを作成します。コマンドpdist2(M,N)
を呼び出すだけです。
私はPythonでこれに代わるものを探しています。もちろん、2つのforループを書くこともできますが、2つのnumpy配列を使用しているため、forループを使用することが常に最良の選択であるとは限りません。 pythonユニバースにこれのために最適化されたコマンドはありますか?基本的に私はMATLABの_pdist2
_の代わりにpythonを求めています。
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. ]]
_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
マトリックスが大きすぎない場合、これは他のライブラリを使用せずに行う必要があります。マトリックスが大きい場合、この方法は少し遅くなり、メモリを大量に消費します。
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]])