Обычно 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])
Кажется, он работает только с одномерными массивами и только в том случае, если в левой части задания есть причудливая индексация, но я нигде не смог найти документацию по этому поведению. Задокументировано ли это поведение, если да, то где, а также может ли кто-нибудь привести пример того, когда оно может быть полезным?
Обновление:
Похоже, что тип "ноль" - "плоский", ведет себя так же, есть ли какая-то связь между "плоским" и причудливым индексированием, о которой я не знаю?
>>> 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])