我想在不使用任何循环的情况下在另一个numpy数组的特定位置累积numpy数组的总和。这类似于numpy.put所做的,但我想累积总和而不是替换元素。
考虑以下示例:
import numpy as np
a = np.zeros([2, 2])
b = np.array([[1, 2], [3, 4], [5, 6]])
indices = np.array([[0, 2], [0, 1], [0, 1]])
此处,np.put(a, indices, b)
给出以下结果:
a = [[ 5. 6.][ 2. 0.]]
相反,我想获得:
a = [[ 9. 10.][ 2. 0.]]
有一种有效的方法吗?
答案 0 :(得分:1)
您可以使用np.add.at
:
>>> import numpy as np
>>> a = np.zeros([2, 2])
>>> b = np.array([[1, 2], [3, 4], [5, 6]])
>>> indices = np.array([[0, 2], [0, 1], [0, 1]])
>>>
>>> np.add.at(a.ravel(), indices.ravel(), b.ravel())
>>> a
array([[ 9., 10.],
[ 2., 0.]])
>>>
另一种选择,根据我的经验,np.bincount
:
>>> a = np.zeros([2, 2])
>>> a += np.bincount(indices.ravel(), b.ravel(), minlength=a.size).reshape(a.shape)
>>> a
array([[ 9., 10.],
[ 2., 0.]])
>>>