我有3个Numpy数组,a
,b
和c
。
b
和c
是非常大的数组,长度相同。 b
的每个元素都是0,1或2,a
的长度也是3。
现在我想知道是否有办法消除以下for循环:
for i in range(len(b)):
a[b[i]] += c[i]
任何评论都将不胜感激。
答案 0 :(得分:3)
答案 1 :(得分:2)
您可以使用np.bincount
进行基于ID
的总结,就像这样 -
a += np.bincount(b,c,minlength=a.size)
运行时测试 -
In [136]: # Large arrays as inputs
...: a = np.random.rand(3)
...: c = np.random.rand(10000)
...: b = np.random.randint(0,3,10000)
...:
...: # Make copies for testing
...: a1 = a.copy()
...: a2 = a.copy()
...:
In [137]: def bincount_app(a, b, c): # bincount approach as func
...: a += np.bincount(b,c,minlength=a.size)
...:
In [138]: %timeit np.add.at(a1, b, c) # @user2357112's soln
1000 loops, best of 3: 1.29 ms per loop
In [139]: %timeit bincount_app(a2, b, c)
10000 loops, best of 3: 36.6 µs per loop