[英]Vectorized way of adding to an array that is indexed by another array - Python/NumPy
我有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]
任何评论将不胜感激。
您可以将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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.