Подтвердить что ты не робот

Ненужное причудливое индексирование и присвоение

Обычно 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])
4b9b3361

Ответ 1

Я думаю, что это поведение моделируется R и его предком S/S-plus. То, как работает назначение списка ( "векторное присвоение" ), называется "переработка". Об этом говорит сайт проекта R, но я нашел более осмысляющее объяснение в этой ссылке. В R вектор представляет собой набор измерений, поэтому имеет смысл накладывать или обрезать его так, как он делает. Насколько эта логика сделала его бесчисленным, и почему, по-прежнему остается хорошим вопросом.