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

StackOverflow https://stackoverflow.com/questions/1687566

Вопрос

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

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top