ndarray的numpy sum元素在另一个ndarray的特定位置(类似于np.put)

时间:2018-02-09 16:36:40

标签: python arrays numpy

我想在不使用任何循环的情况下在另一个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.]]

有一种有效的方法吗?

1 个答案:

答案 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.]])
>>>