Список и кортеж ведут себя по-разному

Мне хорошо известно, что между списками и кортежами есть различия, и что кортежи - это не просто константные списки, но есть несколько примеров, когда они фактически обрабатываются кодом по-разному (в отличие от соглашения о кодировании), поэтому я (небрежно) использовали их взаимозаменяемо.

Потом я наткнулся на случай, когда они дают совершенно другое поведение:

>>> import numpy as np
>>> a = np.arange(9).reshape(3,3)
>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> idx = (1,1)
>>> a[idx]
4
>>> idx = [1,1]
>>> a[idx]
array([[3, 4, 5],
       [3, 4, 5]])

Может кто-нибудь объяснить, что здесь происходит? Что еще более важно, где еще эта ловушка появляется в scipy?

1 ответ

Решение

Вы получаете другое поведение, потому что в numpy поддерживаются три типа индексации

  • Базовая нарезка
  • Расширенная индексация
  • Доступ к записи

Использование кортежа для индексации просто эквивалентно списку параметров, суффиксы которого представляют собой базовую секцию, а использование списка, не являющегося кортежем, приводит к расширенному индексированию.

Также помните, из документации

Расширенное индексирование запускается, когда объект выбора, obj, является объектом последовательности, не состоящим из кортежей, ndarray (с типом данных integer или bool) или кортежем, по крайней мере, с одним объектом последовательности или ndarray (с типом данных integer или bool). Существует два типа расширенной индексации: целочисленная и логическая.

Расширенная индексация всегда возвращает копию данных (в отличие от базовой нарезки, которая возвращает представление).

И более того, из той же документации

В Python x[(exp1, exp2, ..., expN)] эквивалентен x[exp1, exp2, ..., expN]; последний - просто синтаксический сахар для первого.

Другие вопросы по тегам