Почему назначение для массивов numpy с двойным срезом не работает?
-
18-09-2019 - |
Вопрос
почему следующие строки не работают так, как я ожидаю?
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[a==1] на самом деле не является срезом.Он создает новый массив.Если подумать, это имеет смысл — вы берете только те элементы, которые удовлетворяют логическому условию (например, операция фильтра).
Это делает то, что вы хотите
a[2:][a[2:]==1]=3