web-dev-qa-db-ja.com

python行ベクトルの行列間のnumpyユークリッド距離計算

私はNumpyを初めて使用するので、ベクトルに格納されているポイント間のユークリッド距離を計算する方法をお聞きします。

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

ここにインターフェースがあります:

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

listOfDistances= procedure( points,singlePoint)

このようなものはありますか?または、単一のポイントを他のポイントのリストとして持つ1つのコマンドを使用して、最後に距離の行列を取得することは可能ですか?

ありがとう

22
pacodelumberg

ベクトル化を使用できますが、@ 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)
18
Joe Kington

距離を取得するには、numpyでlinalgモジュールのノルムメソッドを使用できます。

np.linalg.norm(x - y)
10
Christian
import numpy as np
def distance(v1, v2):
    return np.sqrt(np.sum((v1 - v2) ** 2))    
5
Dima

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

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

Zipを使用して座標をペアリングし、sumを内包表記と組み合わせて結果を合計できます。それは次のようになります:

sum((x - y) ** 2 for (x, y) in Zip(singlePoint, pointFromArray)) ** 0.5
2
Karl Knechtel
import numpy as np
single_point = [3, 4]
points = np.arange(20).reshape((10,2))   
distance = euclid_dist(single_point,points)

def euclid_dist(t1, t2):
    return np.sqrt(((t1-t2)**2).sum(axis = 1))
0
rombi