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

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

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

>>> 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 (типа данных целое или bool). Существует два типа расширенной индексации: integer и Boolean.

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

Кроме того, из той же документации

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