`np.add.at` в 2-мерный массив - PullRequest
0 голосов
/ 21 января 2019

Я ищу 2-мерную версию 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 голосов
/ 21 января 2019

Вы можете использовать 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

Если вы действительно беспокоитесь о многомерном аспекте, и ваш augend является непрерывным массивом C порядка ванили, вы можете использовать ravel и ravel_multi_index для выполнения операции на одномерном виде:

indices = np.ravel_multi_index((indices_for_dim0, indices_for_dim1), augend.shape)
raveled = augend.ravel()
np.add.at(raveled, indices, addend)
0 голосов
/ 21 января 2019

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

При использовании 2d-массива для np.add.at, indices должен иметь кортеж, где tuple[0] содержит все первые координаты, а tuple[1] содержит все вторые координаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...