3

numpyにポイントの配列があります:

points = rand(dim, n_points)

そして私はしたい:

  1. 特定の点と他のすべての点の間のすべてのl2ノルム(ユークリッド距離)を計算します
  2. すべてのペアワイズ距離を計算します。

そして、できればすべてがおかしくなり、forはありません。どうすればそれができますか?

4

2 に答える 2

4

SciPy を使用する意思がある場合、scipy.spatial.distanceモジュール (関数cdistおよび/またはpdist) は、C で行われるすべてのループを使用して、必要な処理を正確に実行します。ブロードキャストでも実行できますが、余分なメモリ オーバーヘッドが発生します。

于 2010-03-20T20:13:22.473 に答える
1

これは、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 を入れてから放送することです。

幸運を!

于 2010-03-20T14:33:08.240 に答える