Почему назначение двурядных массивов numpy не работает?

Почему следующие строки не работают, как я ожидаю?

import numpy as np
a = np.array([0,1,2,1,1])
a[a==1][1:] = 3
print a
>>> [0 1 2 1 1]
# I would expect [0 1 2 3 3]

Является ли это "ошибкой" или есть другой рекомендуемый способ?

С другой стороны, следующие работы:

a[a==1] = 3
print a
>>> [0 3 2 3 3]

Приветствия, Филипп

Ответ 1

Похоже, вы просто не можете выполнить назначение через такой двойной фрагмент.

Это работает, хотя:

a[numpy.where(a==1)[0][1:]] = 3

Ответ 2

Это связано с тем, как работает причудливая индексация. Существует подробное объяснение здесь. Это делается таким образом, чтобы разрешить модификацию места с фантазийным индексированием (т.е. a[x>3] *= 2). Следствием этого является то, что вы не можете назначить двойной индекс, как вы его нашли. Необычная индексация всегда возвращает копию, а не представление.

Ответ 3

Поскольку часть [a == 1] на самом деле не является срезом. Он создает новый массив. Это имеет смысл, когда вы думаете об этом - вы принимаете только элементы, которые удовлетворяют логическому состоянию (например, операция фильтра).

Ответ 4

Это делает то, что вы хотите

a[2:][a[2:]==1]=3