Ожидаемое поведение для повторных операций numpy


Я нашел этот ответ, когда искал задачу о повторяющихся действиях над массивами numpy: инкремент numpy multi-D массив с повторяющимися индексами. Теперь мой вопрос заключается в том, почему такое поведение замечается.

import numpy as np
t = np.eye(4)

t[[0,0,1],[0,0,1]]

Приводит к

array([1.,1.,1.])

Так не должно

t[[0,0,1],[0,0,1]]+=1 

Привести к

[[3,0,0,0],
 [0,2,0,0],
 [0,0,1,0],
 [0,0,0,1]]

?

1 2

1 ответ:

Смотрите документациюпо индексации массива и разницу между базовой и расширенной индексацией.

t[[0,0,1],[0,0,1]] подпадает под категорию расширенного индексирования и, как указано в документе doc:

Расширенное индексирование всегда возвращает копию данных (в отличие от базового среза, который возвращает представление).

Копия вычисляется до первого приращения, так что, как и ожидалось,

import numpy as np
t = np.eye(4)
t[[0,0,1],[0,0,1]] += 1
print(t)

Отпечатки пальцев:

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

В соответствии с приведенными выше комментариями используйте numpy.ufunc.at или numpy.add.at чтобы обойти это.