Questo è emerso dalle funzionalità nascoste di Python , ma non riesco a vedere una buona documentazione o esempi che spieghino come funziona la funzione.
Questo è emerso dalle funzionalità nascoste di Python , ma non riesco a vedere una buona documentazione o esempi che spieghino come funziona la funzione.
Risposte:
Ellipsis
o ...
non è una funzione nascosta, è solo una costante. È abbastanza diverso, per esempio, da javascript ES6 in cui fa parte della sintassi del linguaggio. Nessuna classe incorporata o struttura del linguaggio Python la utilizza.
Quindi la sintassi dipende interamente da te o da qualcun altro, che ha scritto codice per capirlo.
Numpy lo utilizza, come indicato nella documentazione . Alcuni esempi qui .
Nella tua classe, lo useresti in questo modo:
>>> class TestEllipsis(object):
... def __getitem__(self, item):
... if item is Ellipsis:
... return "Returning all items"
... else:
... return "return %r items" % item
...
>>> x = TestEllipsis()
>>> print x[2]
return 2 items
>>> print x[...]
Returning all items
Naturalmente, c'è la documentazione di Python e il riferimento al linguaggio . Ma quelli non sono molto utili.
I puntini di sospensione vengono utilizzati in numpy per tagliare strutture di dati di dimensioni superiori.
È progettato per significare a questo punto, inserire tante sezioni intere ( :
) per estendere la sezione multidimensionale a tutte le dimensioni .
Esempio :
>>> from numpy import arange
>>> a = arange(16).reshape(2,2,2,2)
Ora hai una matrice quadridimensionale di ordine 2x2x2x2. Per selezionare tutti i primi elementi nella 4a dimensione, è possibile utilizzare la notazione con i puntini di sospensione
>>> a[..., 0].flatten()
array([ 0, 2, 4, 6, 8, 10, 12, 14])
che equivale a
>>> a[:,:,:,0].flatten()
array([ 0, 2, 4, 6, 8, 10, 12, 14])
Nelle tue implementazioni, sei libero di ignorare il contratto sopra menzionato e usarlo per quello che ritieni opportuno.
a[:,:,:,0]
restituirà una copia e a[...,0]
restituirà la "vista" e non la copia? Ho provato a correre id()
su entrambe le versioni e per un array a 3 dim: a[:,:,:, 0], a[:,:,:, 1], a[:,:,:, 2]
tutti hanno ID diversi mentre: a[..., 0], a[..., 1], a[..., 2]
tutti hanno gli stessi ID.
id()
restituisce lo stesso valore per entrambi. Anche il controllo con __array_interface__['data']
mostra lo stesso indirizzo di memoria.
a[indexes, ...]
mentre a è un array a 1 dimensione anche!
Questo è un altro uso di Ellipsis, che non ha nulla a che fare con le sezioni: lo uso spesso nella comunicazione intra-thread con le code, come un segno che segnala "Fatto"; è lì, è un oggetto, è un singleton e il suo nome significa "mancanza di", e non è il None abusato (che potrebbe essere inserito in una coda come parte del normale flusso di dati). YMMV.
Come indicato in altre risposte, può essere utilizzato per creare sezioni. Utile quando non si desidera scrivere molte notazioni di sezioni complete ( :
) o quando non si è sicuri su quale sia la dimensione dell'array manipolata.
Ciò che ho ritenuto importante evidenziare, e che mancava nelle altre risposte, è che può essere utilizzato anche quando non ci sono più dimensioni da riempire.
Esempio:
>>> from numpy import arange
>>> a = arange(4).reshape(2,2)
Ciò comporterà un errore:
>>> a[:,0,:]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: too many indices for array
Questo funzionerà:
a[...,0,:]
array([0, 1])