2011-12-26 12 views
1

私はk-medoidsのクラスタリングアルゴリズムをPython/NumPyで実装しようとしています。この孤独の一環として、私はオブジェクトから "メドイド"(クラスター代表)までの距離の合計を計算する必要があります。NumPy:点集合に対する距離のベクトル化

私が持っている:5点

n_samples = 5 
D = np.array([[ 0.  , 3.04959014, 4.74341649, 3.72424489, 6.70298441], 
       [ 3.04959014, 0.  , 5.38516481, 4.52216762, 6.16846821], 
       [ 4.74341649, 5.38516481, 0.  , 1.02469508, 8.23711114], 
       [ 3.72424489, 4.52216762, 1.02469508, 0.  , 7.69025357], 
       [ 6.70298441, 6.16846821, 8.23711114, 7.69025357, 0.  ]]) 

初期medoidsの組

medoids = np.array([0, 3]) 

に距離行列を、クラスタが

cl = np.array([0, 0, 1, 1, 0]) 

をメンバーシップ私が使用して必要な合計を計算することができます。

>>> np.sum(D[i, medoids[cl[i]]] for i in xrange(n_samples)) 
10.777269622938899 

しかし、それはPythonループを使用します。私はこの和を計算するためにベクトル化されたイディオムを失っていますか?

答えて

1

方法について:

In [17]: D[np.arange(n_samples),medoids[cl]].sum() 
Out[17]: 10.777269629999999