Angenommen, ich habe:
test = numpy.array([[1, 2], [3, 4], [5, 6]])
test[i]
holt mir die i-te Zeile des Arrays (zB [1, 2]
). Wie kann ich auf die i-te Spalte zugreifen ? (zB [1, 3, 5]
). Wäre dies auch eine teure Operation?
>>> test[:,0]
array([1, 3, 5])
Ähnlich,
>>> test[1,:]
array([3, 4])
Ermöglicht den Zugriff auf Zeilen. Dies wird in Abschnitt 1.4 (Indexierung) der NumPy-Referenz behandelt . Das geht schnell, zumindest nach meiner Erfahrung. Es ist sicherlich viel schneller als auf jedes Element in einer Schleife zuzugreifen.
Wenn Sie auf mehrere Spalten gleichzeitig zugreifen möchten, können Sie Folgendes tun:
quelle
test[:,[0,2]]
Nur Zugriff auf die Daten, z. B.test[:, [0,2]] = something
würde den Test ändern und kein weiteres Array erstellen. Erstelltcopy_test = test[:, [0,2]]
aber tatsächlich eine Kopie, wie Sie sagen.test[:,[0,2]]
einfach auf die Daten zu, währendtest[:, [0, 2]][:, [0, 1]]
dies nicht der Fall ist? Es scheint sehr unintuitiv zu sein, dass es ein anderes Ergebnis ist, dasselbe noch einmal zu tun.Dieser Befehl gibt Ihnen einen Zeilenvektor. Wenn Sie nur eine Schleife darüber ausführen möchten, ist dies in Ordnung. Wenn Sie jedoch mit einem anderen Array mit der Dimension 3xN stapeln möchten, haben Sie einen
während
gibt Ihnen einen Spaltenvektor, damit Sie verketten oder stapeln können.
z.B
quelle
Sie können auch eine Zeile transponieren und zurückgeben:
quelle
Um mehrere und unabhängige Spalten zu erhalten, gehen Sie einfach wie folgt vor:
Sie erhalten die Spalten 0 und 2
quelle
Obwohl die Frage beantwortet wurde, möchte ich einige Nuancen erwähnen.
Angenommen, Sie interessieren sich für die erste Spalte des Arrays
Wie Sie bereits aus anderen Antworten wissen
(3,)
, verwenden Sie das Schneiden , um es in Form eines "Zeilenvektors" (Array of Shape ) zu erhalten:Gehen Sie wie folgt vor, um zu überprüfen, ob ein Array eine Ansicht oder eine Kopie eines anderen Arrays ist:
siehe ndarray.base .
Neben dem offensichtlichen Unterschied zwischen den beiden (die Änderung
arr_c1_ref
wirkt sich ausarr
) ist die Anzahl der Byte-Schritte zum Durchlaufen jedes einzelnen von ihnen unterschiedlich:siehe Schritte . Warum ist das wichtig? Stellen Sie sich vor, Sie haben ein sehr großes Array
A
anstelle vonarr
:und Sie möchten die Summe aller Elemente der ersten Spalte berechnen, dh
A_c1_ref.sum()
oderA_c1_copy.sum()
. Die Verwendung der kopierten Version ist viel schneller:Dies ist auf die unterschiedliche Anzahl der zuvor genannten Schritte zurückzuführen:
Obwohl es den Anschein hat, dass die Verwendung von Spaltenkopien besser ist, trifft dies nicht immer zu, da das Erstellen einer Kopie Zeit in Anspruch nimmt und mehr Speicher benötigt (in diesem Fall habe ich ca. 200 µs benötigt, um die zu erstellen
A_c1_copy
). Wenn wir jedoch die Kopie an erster Stelle benötigen oder viele verschiedene Operationen an einer bestimmten Spalte des Arrays ausführen müssen und es uns recht ist, Speicher für Geschwindigkeit zu opfern, ist das Erstellen einer Kopie der richtige Weg.Für den Fall, dass wir hauptsächlich mit Spalten arbeiten möchten, ist es möglicherweise eine gute Idee, unser Array in der Reihenfolge Spalten-Major ('F') anstelle der Reihenfolge Zeilen-Major ('C') (die Standardeinstellung) zu erstellen ) und schneiden Sie dann wie zuvor, um eine Spalte zu erhalten, ohne sie zu kopieren:
Das Ausführen der Summenoperation (oder einer anderen) in einer Spaltenansicht ist jetzt viel schneller.
Abschließend möchte ich darauf hinweisen, dass das Transponieren eines Arrays und das Verwenden des Zeilen-Slicing mit dem Spalten-Slicing des ursprünglichen Arrays identisch ist, da das Transponieren nur durch Vertauschen der Form und der Schritte des ursprünglichen Arrays erfolgt.
quelle
Dann können Sie die 2. - 4. Spalte folgendermaßen auswählen:
quelle