2013-06-28 16 views
13

Ho trovato un codice Python con notazione di sezione che non riesco a trovare. Sembra fetta notazione, ma utilizza una virgola e un elenco:Notazione della sezione Python con virgola/elenco

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

È questa sintassi valida? Se sì, cosa fa?

modifica sembra che è un 2D NumPy matrice

+0

Sei sicuro che 'list' è una lista? Potrebbe essere un'istanza di una classe che sovrascrive '__getitem__' in un modo insolito. – Kevin

+0

Hai provato a digitare (elenco)? Potrebbe essere un array numpy o un dataframe panda. – mattexx

+0

@mattexx, non ho l'intero codice, cosa fa questo in numpy e in panda? – Stephan

risposta

14

Supponendo che l'oggetto è davvero una matrice numpy, questo è noto come advanced indexing, e raccoglie le colonne specificate:

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

noti che questo non funzionerà con l'elenco standard di 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

Esso genera un valore complesso e lo passa al __*item__():

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

ciò che effettivamente esegue dipende dal tipo indicizzato.

Problemi correlati