Dies ist in den versteckten Funktionen von Python aufgetaucht , aber ich kann keine gute Dokumentation oder Beispiele sehen, die erklären, wie die Funktion funktioniert.
Dies ist in den versteckten Funktionen von Python aufgetaucht , aber ich kann keine gute Dokumentation oder Beispiele sehen, die erklären, wie die Funktion funktioniert.
Antworten:
Ellipsis
oder ...
ist kein verstecktes Merkmal, es ist nur eine Konstante. Es ist ganz anders als beispielsweise Javascript ES6, wo es Teil der Sprachsyntax ist. Keine eingebaute Klasse oder Python-Sprachkonstruktion nutzt sie.
Die Syntax dafür hängt also ganz davon ab, ob Sie oder jemand anderes Code geschrieben hat, um ihn zu verstehen.
Numpy verwendet es, wie in der Dokumentation angegeben . Einige Beispiele hier .
In Ihrer eigenen Klasse würden Sie es folgendermaßen verwenden:
>>> 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
Natürlich gibt es die Python-Dokumentation und die Sprachreferenz . Aber die sind nicht sehr hilfreich.
Die Ellipse wird in Numpy verwendet, um höherdimensionale Datenstrukturen zu schneiden.
Es wurde entwickelt , um meine an dieser Stelle einfügen , wie viele Vollscheiben ( :
) , um die mehrdimensionale Scheibe auf alle Dimensionen zu erweitern .
Beispiel :
>>> from numpy import arange
>>> a = arange(16).reshape(2,2,2,2)
Jetzt haben Sie eine 4-dimensionale Matrix der Ordnung 2x2x2x2. Um alle ersten Elemente in der 4. Dimension auszuwählen, können Sie die Ellipsen-Notation verwenden
>>> a[..., 0].flatten()
array([ 0, 2, 4, 6, 8, 10, 12, 14])
das ist äquivalent zu
>>> a[:,:,:,0].flatten()
array([ 0, 2, 4, 6, 8, 10, 12, 14])
In Ihren eigenen Implementierungen können Sie den oben genannten Vertrag ignorieren und für alles verwenden, was Sie für richtig halten.
a[:,:,:,0]
eine Kopie zurückgegeben wird und a[...,0]
die "Ansicht" und nicht die Kopie zurückgegeben wird? Ich habe versucht, id()
gegen beide Versionen und für ein 3-Dim-Array zu laufen : a[:,:,:, 0], a[:,:,:, 1], a[:,:,:, 2]
Alle haben unterschiedliche IDs, während: a[..., 0], a[..., 1], a[..., 2]
alle dieselben IDs haben.
id()
gibt für beide den gleichen Wert zurück. Auch das Überprüfen mit __array_interface__['data']
zeigt die gleiche Speicheradresse.
a[indexes, ...]
während a sogar ein 1-dimensionales Array ist!
Dies ist eine weitere Verwendung für Ellipsis, die nichts mit Slices zu tun hat: Ich verwende sie häufig in der Thread-Kommunikation mit Warteschlangen als Markierung, die "Fertig" signalisiert. es ist da, es ist ein Objekt, es ist ein Singleton, und sein Name bedeutet "Mangel an", und es ist nicht das überstrapazierte None (das als Teil des normalen Datenflusses in eine Warteschlange gestellt werden könnte). YMMV.
Wie in anderen Antworten angegeben, kann es zum Erstellen von Slices verwendet werden. Nützlich, wenn Sie nicht viele vollständige Slices-Notationen ( :
) schreiben möchten oder wenn Sie sich nicht sicher sind, wie dimensioniert das zu manipulierende Array ist.
Was ich für wichtig hielt, um hervorzuheben, und das bei den anderen Antworten fehlte, ist, dass es verwendet werden kann, auch wenn keine Dimensionen mehr gefüllt werden müssen.
Beispiel:
>>> from numpy import arange
>>> a = arange(4).reshape(2,2)
Dies führt zu einem Fehler:
>>> a[:,0,:]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: too many indices for array
Das wird funktionieren:
a[...,0,:]
array([0, 1])