Frage

Ich habe einen 2D numpy Array. Gibt es eine Möglichkeit, einen Blick auf sie zu schaffen, dass die ersten k Zeilen und alle Spalten enthalten würde?

Der Punkt ist, die zugrunde liegenden Daten zu vermeiden Kopieren (das Array so groß ist, dass machen Teilkopien nicht möglich ist.)

War es hilfreich?

Lösung

Sicher, gerade Index, wie Sie es normalerweise tun würde. Z.B. y = x[:k, :] Dies wird einen Blick in das ursprüngliche Array zurück. Keine Daten werden kopiert, und alle Aktualisierungen vorgenommen y wird kehrt in x und umge reflektiert werden.


Edit:

ich häufig Arbeit mit> 10GB 3D-Arrays von uint8 ist, so dass ich diese Sorgen über viel ... Numpy kann bei Speicherverwaltung sehr effizient sein, wenn Sie ein paar Dinge im Auge zu behalten. Hier sind ein paar Tipps zur Anfertigung von Kopien von Arrays im Speicher zu vermeiden:

Mit +=, -=, *= usw. zu vermeiden, dass eine Kopie des Arrays zu machen. Z.B. x += 10 wird das Array an Ort und Stelle ändern, während x = x + 10 wird eine Kopie erstellen und modifizieren. (Auch, einen Blick auf numexpr )

Wenn Sie eine Kopie mit x = x + 10 machen wollen, beachten Sie, dass x = x + 10.0 x automatisch up-gegossen zu einem Gleitkomma-Array verursachen wird, wenn es nicht ohnehin schon ist. Jedoch x += 10.0, wo x ein Integer-Array ist, wird die 10.0 dazu führen, dass in einen int der gleichen Präzision wie die Array-down gegossen, statt.

Darüber hinaus nehmen viele numpy Funktionen einen out Parameter, so dass Sie Dinge wie np.abs(x, x) tun können, den absoluten Wert von x an Ort und Stelle zu nehmen.


Als zweites bearbeiten, hier einige Tipps, Ansichten vs. Kopien mit numpy Arrays:

Im Gegensatz zu Python-Listen, y = x[:] kehrt nicht um eine Kopie, die er einen Blick zurück. Wenn Sie eine Kopie möchten (was, natürlich, die doppelte Menge an Speicher Sie verwenden) Verwendung y = x.copy()

Sie werden oft über „fancy Indizierung“ von numpy Arrays hören. Verwendung einer Liste (oder Integer-Array) als ein Index ist "fancy Indexing". Es kann sehr nützlich sein, aber kopiert die Daten.

Als Beispiel hierfür: y = x[[0, 1, 2], :] gibt eine Kopie, während y = x[:3,:] eine Ansicht zurückkehren würde.

Auch wirklich verrückt Indizierung wie x[4:100:5, :-10:-1, None] ist „normal“ Indizierung und eine Ansicht zurückkehren, obwohl, so haben Sie keine Angst, alle Arten von Slicing-Tricks auf große Arrays zu verwenden.

x.astype(<dtype>) wird eine Kopie der Daten als den neuen Typ zurückgeben, whilex.view(<dtype>) einen Blick zurück.

Seien Sie mit diesem vorsichtig, aber ... Es ist extrem leistungsfähig und nützlich, aber Sie müssen verstehen, wie die zugrunde liegenden Daten im Speicher gespeichert wird. Wenn Sie haben eine Reihe von Schwimmern, und sehen sie als ints, (oder umgekehrt) numpy die darunter liegende interpretiert Bits des Arrays als ints.

Zum Beispiel bedeutet dies, dass 1.0 als 64-Bit-Float auf einem Little-Endian-System wird 4607182418800017408, wenn sie als 64-Bit-int betrachtet, und eine Reihe von [ 0, 0, 0, 0, 0, 0, 240, 63] wenn als uint8 angesehen. Das ist wirklich schön, wenn man etwas-Fummel irgendeine Art zu tun, auf großen Arrays benötigen, wenn ... Sie niedrige Niveau Kontrolle darüber, wie der Speicherpuffer interpretiert wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top