2013-06-28 8 views
13

Natknąłem się na jakiś kod Pythona z notacją plastra, że ​​mam problem z ustaleniem. Wygląda notacji plasterka ale używa przecinek oraz listę:Notacja plasterka Pythona z przecinkiem/listą

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

Czy ta składnia jest ważny? Jeśli tak, to co robi?

edit wygląda to jest 2D NumPy tablica

+0

Czy jesteś pewien, że 'lista' to lista? Może to być instancja klasy, która nadpisuje '__getitem__' w niecodzienny sposób. – Kevin

+0

Czy próbowałeś pisać (list)? Może to być tablica liczbowa typu numpy lub pandas. – mattexx

+0

@mattexx, nie mam całego kodu, co to robi w numpy i pandach? – Stephan

Odpowiedz

14

Zakładając, że obiekt jest naprawdę numpy tablica ta jest znana jako advanced indexing i wybiera określone kolumny:

>>> 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]]) 

Zauważ, że to nie będzie działać ze standardowej listy 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 
1

Generuje złożoną wartość i przekazuje go do __*item__():

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

Co faktycznie wykonuje zależy od rodzaju są indeksowane.