2016-06-22 9 views
2

Я нашел этот ответ при поиске проблемы при повторных действиях на массивах numpy: Increment Numpy multi-d array with repeated indices. Теперь мой вопрос: ПОЧЕМУ это поведение наблюдается.Ожидаемое поведение при повторных операциях numpy

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

Есть проблема с буферизацией. 'np.add.at' предназначен для того, чтобы обойти это. – hpaulj

+1

http://docs.scipy.org/doc/numpy/reference/generated/numpy.ufunc.at.html – hpaulj

ответ

1

См. documentation для индексации массива и разницы между базовым и расширенным индексированием.

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, чтобы обойти эту проблему.