numpy.array.__iadd__ 与重复索引
我有一个数组:
A = np.array([0, 0, 0])
还有一个包含重复索引的列表:
idx = [0, 0, 1, 1, 2, 2]
我还有另一个数组,想用上面的索引把它加到数组A里:
B = np.array([1, 1, 1, 1, 1, 1])
这个操作:
A[idx] += B
得到了结果:array([1, 1, 1])
,所以很明显,数组B
的值没有被加起来。那么,怎样才能得到结果array([2, 2, 2])
呢?我需要一个一个地遍历这些索引吗?
2 个回答
1
这样怎么样:
A = np.array([1, 2, 3])
idx = [0, 0, 1, 1, 2, 2]
A += np.bincount(idx, minlength=len(A))
显然,如果A一开始就是零,那就更简单了:
A = np.bincount(idx)
30
在numpy 1.8版本中,新增了一个叫做at
的功能:
at(a, indices, b=None)
这个功能可以直接在操作数'a'上进行不使用缓冲区的操作,针对的是由'indices'指定的元素。对于加法操作,这个方法和
a[indices] += b
是一样的,唯一的不同是如果某些元素被多次索引,结果会累加。例如,a[[0,0]] += 1
只会让第一个元素增加一次,因为它使用了缓冲,而add.at(a, [0,0], 1)
会让第一个元素增加两次。.. 这个功能是在1.8.0版本中新增的。
In [1]: A = np.array([0, 0, 0])
In [2]: B = np.array([1, 1, 1, 1, 1, 1])
In [3]: idx = [0, 0, 1, 1, 2, 2]
In [4]: np.add.at(A, idx, B)
In [5]: A
Out[5]: array([2, 2, 2])