Нотация среза Python с запятой/списком

Я столкнулся с некоторым кодом Python с нотацией среза, который мне трудно понять. Это похоже на нотацию среза, но использует запятую и список:

list[:, [1, 2, 3]]

Является ли этот синтаксис допустимым? Если да, то что он делает?

edit выглядит так, как будто это двумерный массив numpy


person Stephan    schedule 28.06.2013    source источник
comment
Вы уверены, что list — это список? Это может быть экземпляр класса, который необычным образом переопределяет __getitem__.   -  person Kevin    schedule 28.06.2013
comment
Вы пробовали тип (список)? Это может быть массив numpy или кадр данных pandas.   -  person mattexx    schedule 28.06.2013
comment
@mattexx, у меня нет всего кода, что это делает в numpy и pandas?   -  person Stephan    schedule 28.06.2013
comment
Массивы Numpy и фреймы данных pandas используют двумерные массивы, как в Matlab и r. Первый аргумент обычно представляет срез строк, а второй — срез столбцов. Таким образом, list[:,:3] будет состоять из всех строк, первых трех столбцов. Я не уверен, поддерживает ли точную запись, которую вы указали в своем вопросе.   -  person mattexx    schedule 28.06.2013
comment
@mattexx: просто чтобы ОП не запутался, может быть полезно подчеркнуть, что массивы numpy не являются принципиально двумерными объектами, как некоторые другие структуры данных. Они n-D.   -  person DSM    schedule 28.06.2013


Ответы (2)


Предполагая, что объект действительно представляет собой массив numpy, он называется расширенное индексирование и выбирает указанные столбцы:

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

Обратите внимание, что это не будет работать со стандартным списком Python:

>>> a.tolist()
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]
>>> a.tolist()[:,[1,2,3]]
Traceback (most recent call last):
  File "<ipython-input-17-7d77de02047a>", line 1, in <module>
    a.tolist()[:,[1,2,3]]
TypeError: list indices must be integers, not tuple
person DSM    schedule 28.06.2013

Он генерирует сложное значение и передает его __*item__():

>>> class Foo(object):
...   def __getitem__(self, val):
...     print val
... 
>>> Foo()[:, [1, 2, 3]]
(slice(None, None, None), [1, 2, 3])

То, что он на самом деле выполняет, зависит от индексируемого типа.

person Ignacio Vazquez-Abrams    schedule 28.06.2013