Numpy фантазии индексации и назначения - PullRequest
12 голосов
/ 24 февраля 2012

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

1 Ответ

1 голос
/ 06 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...