私はNumpyを初めて使用するので、ベクトルに格納されているポイント間のユークリッド距離を計算する方法をお聞きします。
Numpy.arrayがあり、各行がベクトルで単一のnumpy.arrayであると仮定します。すべての点とこの単一の点の間のユークリッド距離を計算して、それらを1つのnumpy.arrayに格納できるかどうかを知りたいのですが。
ここにインターフェースがあります:
points #2d list of row-vectors
singlePoint #one row-vector
listOfDistances= procedure( points,singlePoint)
このようなものはありますか?または、単一のポイントを他のポイントのリストとして持つ1つのコマンドを使用して、最後に距離の行列を取得することは可能ですか?
ありがとう
ベクトル化を使用できますが、@ 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)
距離を取得するには、numpyでlinalgモジュールのノルムメソッドを使用できます。
np.linalg.norm(x - y)
import numpy as np
def distance(v1, v2):
return np.sqrt(np.sum((v1 - v2) ** 2))
Numpy配列の各要素に関数を適用するには、 numpy.vectorize を試してください。
実際の計算を行うには、2つのベクトルの座標のペア間の差の2乗の和の平方根(whew!)が必要です。
Zip
を使用して座標をペアリングし、sum
を内包表記と組み合わせて結果を合計できます。それは次のようになります:
sum((x - y) ** 2 for (x, y) in Zip(singlePoint, pointFromArray)) ** 0.5
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))