2017-09-30 2 views
0

の形状が(N,)で、N~O(1e9)の配列があるとします。 次に、(M1,M2,M2)の結果配列bがあります。最速の繰り返しインデックスの追加(複数の次元の場合はnp.add.at)

次に、の各行にインデックス番号(N,3)のインデックス配列fがあります。

私は可能な限り迅速に達成したいことは、以下の結果であり、

for i in range(N): 
    b[*f[i]] += a[i] 

ファンシーインデックス繰り返しインデックスがfであるのでb[f[:,0],f[:,1],f[:,2]] += aが動作しないようなので、それだけで、それぞれの最後のオカレンスを追加しますインデックスはbになります。

bが1Dの場合は、np.add.at(b,f,a)とすることができます。

私は最速のオプションを探しています。

答えて

1

ようなので、インデックスのタプルを渡し、np.add.atを使用する - 私は、

lidx = np.ravel_multi_index(f.T,b.shape) 
b += np.bincount(lidx, a, minlength=b.size).reshape(b.shape) 
+0

おかげ -

np.add.at(b, (f[:,0], f[:,1], f[:,2]), a) 

速い方法がそうように、線形指数を計算した後np.bincountであろうnp.bincountメソッドが大規模なもので約30倍高速です! –

関連する問題