2010-12-06 26 views
12

私はNumpyを新しくしました。ベクトルに格納された点間のユークリッド距離を計算する方法をお聞きしたいと思います。python numpy euclidean行ベクトルの行列間の距離計算

numpy.arrayがあるとしましょう。各行はベクトルと1つのnumpy.arrayです。私は、すべての点とこの単一の点の間のユークリッド距離を計算し、それらを1つのnumpy.arrayに格納することが可能かどうかを知りたいと思います。ここで

はインターフェイスです:

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

listOfDistances= procedure(points,singlePoint) 

は、我々はこのようなものを持つことができますか? または、1つのコマンドを他のポイントのリストとして持つことは可能ですか?最後に、距離のマトリックスが得られますか?

おかげ

+1

ポイントとポイントのセット、私はscipy.spatial.distance.cdistはまだ動作すると思います。 2つのコレクションがあり、そのうちの1つには1つの要素しかありません。 http://stackoverflow.com/questions/1871536/euclidean-distance-between-points-in-two-different-numpy-arrays-not-within –

+0

@JimRaynor +1正確に私が必要としていたもの: – ocean800

答えて

16

vectorizeを使用することはできますが、@ Karlの手法はnumpy配列ではかなり遅くなります。

より簡単なアプローチは、np.hypot(*(points - single_point).T)です。 (転置はポイントが2xNではなくNx2配列であると仮定します.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

がnumpyの配列の各要素に関数を適用するには、numpy.vectorizeを試してみてください。

実際の計算を行うには、2つのベクトルの座標ペア間の差の平方和(2乗和)の平方根が必要です。

zipを使用して座標をペアにし、sumを理解して結果を合計することができます。それは次のようになります:

3
import numpy as np 
def distance(v1, v2): 
    return np.sqrt(np.sum((v1 - v2) ** 2))  
+1

説明できますかあなたのコードは何をしていますか? – Athafoud

+0

これは上記と同じですが、1行で表示されます –

0

あなたがnumpyのでlinalgモジュールの標準メソッドを使用することができ、距離を取得するには:あなたが間の距離を計算したいが

np.linalg.norm(x - y) 
関連する問題