`np.add.at`到二维数组

时间:2019-01-21 06:59:40

标签: python numpy

我正在寻找np.add.at()的二维版本。

预期的行为如下。

augend = np.zeros((10, 10))
indices_for_dim0 = np.array([1, 5, 2])
indices_for_dim1 = np.array([5, 3, 1])
addend = np.array([1, 2, 3])

### some procedure substituting np.add.at ###

assert augend[1, 5] == 1
assert augend[5, 3] == 2
assert augend[2, 1] == 3

任何建议都会有所帮助!

2 个答案:

答案 0 :(得分:1)

Oneliner:

np.add.at(augend, (indices_for_dim0, indices_for_dim1), addend)
augend
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
       [0., 3., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 2., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])

assert augend[1, 5] == 1
assert augend[5, 3] == 2
assert augend[2, 1] == 3
# No AssertionError

当对np.add.at使用2d数组时,indices必须是一个元组,其中tuple[0]包含所有第一坐标,而tuple[1]包含所有第二坐标。

答案 1 :(得分:1)

您可以按原样使用np.add.at多维。 indices自变量在描述中包含以下内容:

  

...如果第一个操作数具有多个维,则索引可以是数组的元组,例如索引对象或切片

所以:

augend = np.zeros((10, 10))
indices_for_dim0 = np.array([1, 5, 2])
indices_for_dim1 = np.array([5, 3, 1])
addend = np.array([1, 2, 3])
np.add.at(augend, (indices_for_dim0, indices_for_dim1), addend)

更简单:

augend[indices_for_dim0, indices_for_dim1] += addend

如果您真的担心多维方面,并且您的建议是香草连续的C阶数组,则可以使用ravelravel_multi_index在1D视图上执行操作:

indices = np.ravel_multi_index((indices_for_dim0, indices_for_dim1), augend.shape)
raveled = augend.ravel()
np.add.at(raveled, indices, addend)