numpyにポイントの配列があります:
points = rand(dim, n_points)
そして私はしたい:
- 特定の点と他のすべての点の間のすべてのl2ノルム(ユークリッド距離)を計算します
- すべてのペアワイズ距離を計算します。
そして、できればすべてがおかしくなり、forはありません。どうすればそれができますか?
numpyにポイントの配列があります:
points = rand(dim, n_points)
そして私はしたい:
そして、できればすべてがおかしくなり、forはありません。どうすればそれができますか?
SciPy を使用する意思がある場合、scipy.spatial.distance
モジュール (関数cdist
および/またはpdist
) は、C で行われるすべてのループを使用して、必要な処理を正確に実行します。ブロードキャストでも実行できますが、余分なメモリ オーバーヘッドが発生します。
これは、2番目の部分に役立つ場合があります。
import numpy as np
from numpy import *
p=rand(3,4) # this is column-wise so each vector has length 3
sqrt(sum((p[:,np.newaxis,:]-p[:,:,np.newaxis])**2 ,axis=0) )
を与える
array([[ 0. , 0.37355868, 0.64896708, 1.14974483],
[ 0.37355868, 0. , 0.6277216 , 1.19625254],
[ 0.64896708, 0.6277216 , 0. , 0.77465192],
[ 1.14974483, 1.19625254, 0.77465192, 0. ]])
p だったら
array([[ 0.46193242, 0.11934744, 0.3836483 , 0.84897951],
[ 0.19102709, 0.33050367, 0.36382587, 0.96880535],
[ 0.84963349, 0.79740414, 0.22901247, 0.09652746]])
そして、次の方法でエントリの1つを確認できます
sqrt(sum ((p[:,0]-p[:,2] )**2 ))
0.64896708223796884
コツは、newaxis を入れてから放送することです。
幸運を!