Обычно numpy заставляет левую и правую стороны присваивания совпадать, например, если я делаю a[:] = b
, b
должен иметь одинаковую форму или широковещать в той же форме, что и a
. Но, похоже, существует исключение из этого правила:
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b = a.copy()
>>> a[[0,1,2]] = b[::2]
>>> a
array([0, 2, 4, 3, 4, 5, 6, 7, 8, 9])
>>> a[np.arange(10)] = b[:2]
>>> a
array([0, 1, 0, 1, 0, 1, 0, 1, 0, 1])
Кажется, что он работает только с массивами 1d, и только если в левой части задания есть фантастическая индексация, но я не смог найти документацию для этого поведения в любом месте. Является ли это поведение документированным, если да, где, а также может кто-нибудь дать пример того, когда это может быть полезно?
Update:
Кажется, что тип numiter flatiter ведет себя так же, есть ли какая-то связь между выравнивателем и причудливой индексацией, о которой я не знаю?
>>> a.flat = [10,11]
>>> a
array([10, 11, 10, 11, 10, 11, 10, 11, 10, 11])
>>> a.flat[:] = [2,3,4]
>>> a
array([2, 3, 4, 2, 3, 4, 2, 3, 4, 2])
>>> a.flat = range(100)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])