Можно ли использовать numpy.add.at с 2D-индексами? - PullRequest
0 голосов
/ 08 июня 2019

У меня есть 2 массива:
- image - массив NxN,
- indices - это массив Mx2, в котором последнее измерение сохраняет действительные индексы в image.

Я хочу добавить 1 в image для каждого вхождения этого индекса в indices.

Кажется, что numpy.add.at(image, indices, 1) должен сделать трюк, за исключением того, что я не могу заставить его выполнить двумерную индексацию в image:

image = np.zeros((5,5), dtype=np.int32)
indices = np.array([[1,1], [1,1], [3,3]])
np.add.at(image, indices, 1)
print(image)

Результат:

[[0 0 0 0 0]
 [4 4 4 4 4]
 [0 0 0 0 0]
 [2 2 2 2 2]
 [0 0 0 0 0]]

Желаемый результат:

[[0 0 0 0 0]
 [0 2 0 0 0]
 [0 0 0 0 0]
 [0 0 0 1 0]
 [0 0 0 0 0]]

1 Ответ

1 голос
/ 09 июня 2019
In [477]: np.add.at(x,(idx[:,0],idx[:,1]), 1)                                                          
In [478]: x                                                                                            
Out[478]: 
array([[0., 0., 0., 0., 0.],
       [0., 2., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 0.]])

или эквивалентно

In [489]: np.add.at(x,tuple(idx.T), 1)                                                                 
In [490]: x                                                                                            
Out[490]: 
array([[0., 0., 0., 0., 0.],
       [0., 2., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 0.]])

где:

In [491]: tuple(idx.T)                                                                                 
Out[491]: (array([1, 1, 3]), array([1, 1, 3]))
In [492]: x[tuple(idx.T)]                                                                              
Out[492]: array([2., 2., 1.])
...