Ожидаемое поведение для повторных операций 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 ответ:
Смотрите документациюпо индексации массива и разницу между базовой и расширенной индексацией.
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
чтобы обойти это.