Ответ 1
Похоже, вы просто не можете выполнить назначение через такой двойной фрагмент.
Это работает, хотя:
a[numpy.where(a==1)[0][1:]] = 3
Почему следующие строки не работают, как я ожидаю?
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]
Приветствия, Филипп
Похоже, вы просто не можете выполнить назначение через такой двойной фрагмент.
Это работает, хотя:
a[numpy.where(a==1)[0][1:]] = 3
Это связано с тем, как работает причудливая индексация. Существует подробное объяснение здесь. Это делается таким образом, чтобы разрешить модификацию места с фантазийным индексированием (т.е. a[x>3] *= 2
). Следствием этого является то, что вы не можете назначить двойной индекс, как вы его нашли. Необычная индексация всегда возвращает копию, а не представление.
Поскольку часть [a == 1] на самом деле не является срезом. Он создает новый массив. Это имеет смысл, когда вы думаете об этом - вы принимаете только элементы, которые удовлетворяют логическому состоянию (например, операция фильтра).
Это делает то, что вы хотите
a[2:][a[2:]==1]=3