Ожидаемое поведение для повторных операций с 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]]

?


person Dschoni    schedule 22.06.2016    source источник
comment
Есть проблема с буферизацией. np.add.at разработан, чтобы обойти это.   -  person hpaulj    schedule 22.06.2016
comment
docs.scipy.org/doc/numpy/reference/ сгенерировано/   -  person hpaulj    schedule 22.06.2016


Ответы (1)


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

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

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

Копия оценивается перед первым приращением, поэтому, как и ожидалось,

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, чтобы обойти это.

person Jacques Gaudin    schedule 22.06.2016