HOWTO · NumPy

So erhalten Sie eine Spalte aus einem NumPy-Array

Wählen Sie eine oder mehrere Spalten aus einem zweidimensionalen NumPy-Array aus, behalten Sie die benötigte Form bei, filtern Sie Zeilen und entscheiden Sie sich für eine Ansicht oder Kopie.

Auf dieser Seite

Verwenden Sie bei einem zweidimensionalen NumPy-Array array[:, column_index], um eine Spalte auszuwählen. Der Doppelpunkt wählt alle Zeilen aus, und die Ganzzahl bestimmt eine nullbasierte Spalte. Beispielsweise gibt data[:, 1] die zweite Spalte als eindimensionales Array zurück. Verwenden Sie stattdessen data[:, 1:2], wenn der nachfolgende Code ein zweidimensionales Ergebnis der Form (rows, 1) benötigt.

Eine Spalte auswählen und ihre Form steuern

NumPy indiziert ein zweidimensionales Array als array[row_selection, column_selection]. Wenn Sie das Komma weglassen, ändert sich die Operation: data[:][1] erzeugt zunächst einen vollständigen Slice und wählt anschließend Zeile 1 aus. Damit wird also nicht Spalte 1 ausgewählt.

Das folgende Beispiel deckt die üblichen Fälle der Spaltenauswahl in einem reproduzierbaren Programm ab:

import numpy as np

data = np.array([[10, 11, 12], [20, 21, 22], [30, 31, 32]])

second = data[:, 1]
second_2d = data[:, 1:2]
adjacent = data[:, :2]
reordered = data[:, [2, 0]]
taken = np.take(data, [0, 2], axis=1)
filtered = data[data[:, 0] >= 20, 2]

print("second:", second, second.shape)
print("second_2d:\n", second_2d, second_2d.shape)
print("adjacent:\n", adjacent)
print("reordered:\n", reordered)
print("taken:\n", taken)
print("filtered:", filtered)

view = data[:, 1]
copy = data[:, 1].copy()
view[0] = 99
print("data after view edit:\n", data)
print("copy:", copy)

Ausgabe:

second: [11 21 31] (3,)
second_2d:
 [[11]
 [21]
 [31]] (3, 1)
adjacent:
 [[10 11]
 [20 21]
 [30 31]]
reordered:
 [[12 10]
 [22 20]
 [32 30]]
taken:
 [[10 12]
 [20 22]
 [30 32]]
filtered: [22 32]
data after view edit:
 [[10 99 12]
 [20 21 22]
 [30 31 32]]
copy: [11 21 31]

Ein ganzzahliger Spaltenindex entfernt diese Achse, was die Form (3,) von second erklärt. Ein Slice mit einem Element behält die Achse bei und erzeugt für second_2d die Form (3, 1). Dieser Unterschied ist wichtig, wenn eine API anstelle eines flachen Vektors eine matrixähnliche Eingabe erwartet.

Mehrere Spalten auswählen

Verwenden Sie für benachbarte Spalten einen Slice wie data[:, :2]. Slicing beschreibt einen zusammenhängenden Bereich und erzeugt normalerweise eine Ansicht. Geben Sie für nicht benachbarte Spalten oder eine benutzerdefinierte Reihenfolge eine Indexliste an: data[:, [2, 0]]. Dies ist Advanced Indexing und erzeugt statt einer Ansicht eine Kopie.

Eine Indexliste behält die Spaltenachse immer bei. Daher hat data[:, [1]] die Form (3, 1), während data[:, 1] die Form (3,) besitzt. Eine Liste kann eine Spalte auch wiederholen oder ihre Position ändern. Prüfen Sie deshalb dynamisch bereitgestellte Indizes, wenn Duplikate oder die Reihenfolge überraschend wären. Verwenden Sie einen Slice, wenn die Spalten einen einfachen Bereich bilden, und eine Indexliste, wenn die Auswahl selbst eine Sequenz ist.

np.take ist eine Alternative, bei der die Achse ausdrücklich angegeben wird. np.take(data, [0, 2], axis=1) wählt die Spalten 0 und 2 aus; axis=1 ist entscheidend, da sich die Spalten auf der zweiten Achse befinden. Dies ist besonders nützlich, wenn die Achse oder die Indizes in Variablen gespeichert sind.

Zeilen filtern, bevor eine Spalte gelesen wird

Eine boolesche Bedingung identifiziert normalerweise Zeilen, nicht Spalten. Erstellen Sie die Zeilenmaske aus einer Spalte und setzen Sie dann die gewünschte Ausgabespalte hinter das Komma. Im Beispiel behält data[:, 0] >= 20 die letzten beiden Zeilen bei, und data[data[:, 0] >= 20, 2] gibt [22 32] aus Spalte 2 zurück. Die Länge der Maske muss mit der Anzahl der Zeilen übereinstimmen.

Entscheiden, ob Sie eine Ansicht oder eine Kopie benötigen

Gemäß den Indizierungsregeln von NumPy gibt Basic Slicing nach Möglichkeit eine Ansicht zurück, während Advanced Indexing eine Kopie erzeugt. Eine Zuweisung über view = data[:, 1] kann deshalb data ändern, wie die 99 in der Ausgabe zeigt. Rufen Sie .copy() auf, wenn die extrahierte Spalte unabhängig sein muss. Die kopierten Werte bleiben [11 21 31], nachdem die Ansicht das Quellarray geändert hat.

Solche Ansichten halten außerdem den Speicher ihres Basisarrays erreichbar. Kopieren Sie eine kleine Spalte, wenn das Beibehalten eines großen Quellarrays Speicher verschwenden würde, nachdem der übrige Teil der Quelle nicht mehr benötigt wird.

Dimensionen und Spaltengrenzen prüfen

Diese Ausdrücke setzen ein zweidimensionales Array voraus. Ein eindimensionales Array besitzt keine Spaltenachse, sodass array[:, 0] einen Indizierungsfehler auslöst. Prüfen Sie array.ndim == 2, wenn die Form der Eingabe ungewiss ist. Bei einem zweidimensionalen Array reichen gültige nichtnegative Spaltenindizes von 0 bis array.shape[1] - 1; ein Index außerhalb dieses Bereichs löst IndexError aus. Auch negative Indizes sind innerhalb der Grenzen gültig, sodass array[:, -1] die letzte Spalte auswählt.