In Numpy (e Python in generale, suppongo), come si memorizza un indice di sezione, ad esempio (..., 0, :), per passarlo e applicarlo a vari array? Sarebbe bello, per esempio, essere in grado di passare uno slice-index da e verso le funzioni.Numpy: arr [..., 0 ,:] funziona. Ma come posso archiviare i dati contenuti nel comando slice (..., 0, :)?
risposta
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))
L'equivalente ad (...,0,:)
dovrebbe essere ...
>>> myslice = (..., 0, slice(None, None))
>>> myslice
(Ellipsis, 0, slice(None, None, None))
No, non è 'slice (0)'; il '0' è solo un indice. –
@Thomas: Sì, mi sono corretto. – JAB
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])
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)
Usa s_ in NumPy:
In [1]: np.s_[...,0,:]
Out[1]: (Ellipsis, 0, slice(None, None, None))
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 :) –