2011-07-22 4 views

risposta

9

Python crea oggetti speciali dalla sintassi della sezione, ma solo all'interno delle parentesi quadre per l'indicizzazione. È possibile creare gli oggetti a mano (in questo caso, (...,0,:) è (Ellipsis, 0, slice(None, None, None)), oppure è possibile creare un oggetto piccolo aiutante:

class ExtendedSliceMaker(object): 
    def __getitem__(self, idx): 
     return idx 

>>> ExtendedSliceMaker()[...,0,:] 
(Ellipsis, 0, slice(None, None, None)) 
+0

Questo risolve direttamente il problema, partendo dal presupposto che in realtà non ti interessi della rappresentazione o di cosa significhi perché stai per passarlo in giro per usarlo in Numpy. Ho avuto lo stesso pensiero in pratica, ma ho mostrato come scavare e capire cosa è tutto :) –

3

L'equivalente ad (...,0,:) dovrebbe essere ...

>>> myslice = (..., 0, slice(None, None)) 
>>> myslice 
(Ellipsis, 0, slice(None, None, None)) 
+0

No, non è 'slice (0)'; il '0' è solo un indice. –

+0

@Thomas: Sì, mi sono corretto. – JAB

0

Penso che si desidera di fare proprio myslice = fetta (1,2) per, ad esempio definire una fetta che restituirà il secondo elemento (cioè myarray [myslice] == myarray [1: 2])

3

La cosa semplice di Python è che si può effettivamente fare una classe per controllare come queste Python usa il metodo magico __getitem__ per gestire le operazioni di indicizzazione, quindi creeremo una classe che sovraccarichi questo per mostrarci cosa è stato passato, istanziare la classe e "indicizza" nell'istanza:

class foo: 
    def __getitem__(self, index): print index 

foo()[...,0,:] 

E il nostro risultato è:

(Ellipsis, 0, slice(None, None, None)) 

Ellipsis e slice sono comandi incorporati, e siamo in grado di leggere la loro documentazione:

help(Ellipsis) 
help(slice) 
5

Usa s_ in NumPy:

In [1]: np.s_[...,0,:] 
Out[1]: (Ellipsis, 0, slice(None, None, None))