понимание списка numpy и оператор +=/-=

Я пытался векторизовать некоторые вычисления списка, но обнаружил что-то странное, когда пытался использовать список в качестве индекса, особенно когда я пытаюсь вернуться к исходному списку, повторяющийся индекс списка кажется бесполезным:

import numpy as np

x = np.arange(10)
y = np.array([1,2,3,4,5])
z = np.array([1,1,1,1,1])

print(x[y], x[z])

>>out: [1 2 3 4 5] [1 1 1 1 1], как я и ожидал

x = np.arange(10)
x[y] -= 1
print(x[y])

>>out: [0 1 2 3 4] это хорошо, так как нет повторения в индексном списке

x = np.arange(10)
x[z] -= 1
print(x[y])

>> out:[0 2 3 4 5], Здесь я ожидаю [-4 2 3 4 5], значит x[1] должен -- 5 раз, а получается вычитать только один раз< /сильный>


person Sock Xu    schedule 16.02.2019    source источник
comment
Возможно, дубликат этого?: stackoverflow.com/questions/15973827/   -  person Jeppe    schedule 17.02.2019


Ответы (1)


Есть проблема с буферизацией. ufuncs был предоставлен .at метод для решения этой проблемы:

In [392]: np.add.at(x,z,-1)
In [394]: x[y]
Out[394]: array([-4,  2,  3,  4,  5])

Я думаю, что документация для ufunc.at хорошо это объясняет.

https://docs.scipy.org/doc/numpy/reference/generated/numpy.ufunc.at.html

Это периодически возникает в других вопросах SO.

x[z] -= 1

оценивается как:

x[z] = x[z] -1

пока вы ожидали:

for i in z:
    x[i] -= 1
person hpaulj    schedule 16.02.2019