NumPy-Array-Attribute
In diesem Kapitel lernen wir einige grundlegende Attribute von NumPy-Arrays kennen.
Die Anzahl der Dimensionen eines NumPy-Arrays wird als Rang bezeichnet. Der Rang ist die Anzahl der Achsen, also die Anzahl der Dimensionen des Arrays.
Ein eindimensionales Array hat Rang 1, ein zweidimensionales Array hat Rang 2 und so weiter.
In NumPy wird jede Dimension eines Arrays als Achse bezeichnet, die ebenfalls eine Dimension ist.
Zum Beispiel kann ein zweidimensionales Array als ein „eindimensionales Array, das aus eindimensionalen Arrays besteht“ angesehen werden: Jedes Element des äußeren Arrays ist selbst ein eindimensionales Array.
Hier entspricht Achse 0 der Richtung des äußersten Arrays, Achse 1 entspricht der Richtung des inneren Arrays und so weiter.
Die Anzahl der Achsen – der Rang – ist die Anzahl der Dimensionen des Arrays.
Viele NumPy-Funktionen unterstützen den Parameter axis.
Bei einem zweidimensionalen Array bedeutet axis=0, entlang Achse 0 zu operieren, das heißt, auf jede Spalte anzuwenden; axis=1 bedeutet, entlang Achse 1 zu operieren, das heißt, auf jede Zeile anzuwenden.
Im Folgenden zeigen wir am Beispiel eines zweidimensionalen Arrays mit der Form (2, 3) anschaulich die Richtungen der beiden Achsen und die Bedeutungen der Attribute:
axis gibt an, "in welche Richtung komprimiert wird", nicht "welche Zeile/Spalte": Summieren entlang axis=0 komprimiert mehrere Zeilen zu einer Zeile, das Ergebnis ist also die Summe jeder Spalte.
Beispiel
a = np.array([[1, 2, 3], [4, 5, 6]])
# Summieren entlang axis 0: über Zeilen komprimieren, jede Spalte summieren
print(a.sum(axis=0))
# Summieren entlang axis 1: über Spalten komprimieren, jede Zeile summieren
print(a.sum(axis=1))
Ausgabeergebnis:
[5 7 9] [ 6 15]
Die interaktive Demonstration unten kann die Summierungsrichtung der beiden Achsen anschaulicher zeigen. Klicken Sie auf die Schaltflächen, um zu wechseln:
a.sum(axis=0) → [5 7 9], die Elemente jeder Spalte entlang axis 0 zu einer Zahl komprimierenZu den wichtigeren Attributen des ndarray-Objekts in NumPy-Arrays gehören:
| Attribute | Beschreibung |
|---|---|
ndarray.ndim | Der Rang des Arrays, d. h. die Anzahl der Dimensionen oder die Anzahl der Achsen des Arrays. |
ndarray.shape | Die Dimensionen des Arrays, die die Größe des Arrays auf jeder Achse angeben. Bei einem zweidimensionalen Array (Matrix) geben sie die Anzahl der Zeilen und Spalten an. |
ndarray.size | Die Gesamtzahl der Elemente im Array, gleichndarray.shapedem Produkt der Größen jeder Achse in shape. |
ndarray.dtype | Der Datentyp der Elemente im Array. |
ndarray.itemsize | Die Größe jedes Elements im Array, in Bytes. |
ndarray.flags | Enthält Informationen über das Speicherlayout, z. B. ob es sich um zusammenhängenden C- oder Fortran-Speicher handelt, ob es schreibgeschützt ist usw. |
ndarray.real | Der Realteil jedes Elements im Array (wenn der Elementtyp komplex ist). |
ndarray.imag | Der Imaginärteil jedes Elements im Array (wenn der Elementtyp komplex ist). |
ndarray.data | Der Puffer, der die Array-Elemente tatsächlich speichert, auf den normalerweise durch Indexierung zugegriffen wird; dieses Attribut wird nicht direkt verwendet. |
ndarray.ndim
ndarray.ndim wird verwendet, um die Anzahl der Dimensionen eines Arrays (d. h. die Anzahl der Achsen) zu erhalten, was der Rang ist.
Beispiel
a = np.arange(24)
print(a.ndim) # a hat jetzt nur noch eine Dimension
# Verwende reshape, um seine Größe anzupassen und es in 2 Seiten, 4 Zeilen und 3 Spalten umzuwandeln
b = a.reshape(2, 4, 3) # b hat jetzt drei Dimensionen
print(b.ndim)
Ausgabeergebnis:
1 3
ndarray.shape
ndarray.shape repräsentiert die Dimensionen des Arrays und gibt ein Tupel zurück. Die Länge dieses Tupels ist die Anzahl der Dimensionen, d. h. die ndim-Eigenschaft (Rang).
Beispielsweise repräsentiert die Shape eines zweidimensionalen Arrays seine "Anzahl der Zeilen" und "Anzahl der Spalten".
Die Reihenfolge des Shape-Tupels stimmt mit der Reihenfolge der Achsen überein: Das 0. Element ist die Größe von Achse 0 (Anzahl der Zeilen), und das 1. Element ist die Größe von Achse 1 (Anzahl der Spalten).
Beispiel
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a.shape)
Ausgabeergebnis:
(2, 3)
ndarray.shape kann auch verwendet werden, um die Größe des Arrays anzupassen.
Beispiel
a = np.array([[1, 2, 3], [4, 5, 6]])
a.shape = (3, 2)
print(a)
Ausgabeergebnis:
[[1 2] [3 4] [5 6]]
NumPy bietet außerdem die reshape-Funktion, um die Größe von Arrays anzupassen.
Beispiel
a = np.array([[1, 2, 3], [4, 5, 6]])
b = a.reshape(3, 2)
print(b)
Ausgabeergebnis:
[[1 2] [3 4] [5 6]]
Der Unterschied zwischen den beiden Methoden: Das direkte Zuweisen eines Werts an a.shape ändert das Array a selbst direkt; a.reshape(3, 2) hingegen gibt ein neues Array-Objekt zurück (das normalerweise dieselben Daten wie a teilt), und a selbst bleibt unverändert.
ndarray.size
ndarray.size gibt die Gesamtzahl der Elemente im Array zurück, gleich dem Produkt der Größen jeder Achse in shape.
Beispiel
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a.shape) # shape ist (2, 3)
print(a.size) # Gesamtanzahl der Elemente: 2 × 3 = 6
Ausgabeergebnis:
(2, 3) 6
ndarray.dtype
ndarray.dtype gibt den Datentyp der Elemente im Array zurück.
Das dtype-Objekt enthält Informationen wie den Typnamen und die Bitbreite der Elemente. Zum Beispiel repräsentiert int64 eine 64-Bit-Ganzzahl und float32 eine 32-Bit-Gleitkommazahl.
Beispiel
# Ganzzahllisten erstellen standardmäßig ein int64-Array (int32 standardmäßig unter Windows)
a = np.array([1, 2, 3])
print(a.dtype)
# Beim Erstellen kann der Datentyp explizit mit dem dtype-Parameter angegeben werden
b = np.array([1, 2, 3], dtype=np.float32)
print(b.dtype)
Ausgabeergebnis:
int64 float32
ndarray.real und ndarray.imag
ndarray.real und ndarray.imag geben jeweils den Realteil und den Imaginärteil jedes Elements im Array zurück, hauptsächlich verwendet, wenn der Elementtyp komplex ist.
Beispiel
# Ein komplexes Array erstellen, der Standardtyp ist complex128
a = np.array([1+2j, 3+4j, 5+6j])
print(a.real) # Der Realteil jedes Elements
print(a.imag) # Der Imaginärteil jedes Elements
Ausgabeergebnis:
[1. 3. 5.] [2. 4. 6.]
ndarray.itemsize
ndarray.itemsize gibt die Größe jedes Elements im Array in Bytes zurück.
Zum Beispiel beträgt für ein Array mit dem Elementtyp float64 der Wert des Attributs itemsize 8 (float64 belegt 64 Bits, und jeweils 8 Bits sind 1 Byte, also 64 ÷ 8 = 8 Bytes).
Ein weiteres Beispiel: Für ein Array mit dem Elementtyp int32 ist der Wert des Attributs itemsize 4 (32 ÷ 8).
Das Produkt aus size und itemsize ist die Gesamtzahl der Bytes, die von den Array-Daten belegt werden, was dem Wert des Attributs ndarray.nbytes entspricht.
Beispiel
# Der dtype des Arrays ist int8, jedes Element belegt 1 Byte
x = np.array([1, 2, 3, 4, 5], dtype=np.int8)
print(x.itemsize)
# Der dtype des Arrays ist float64, jedes Element belegt 8 Bytes
y = np.array([1, 2, 3, 4, 5], dtype=np.float64)
print(y.itemsize)
Ausgabeergebnis:
1 8
ndarray.flags
ndarray.flags gibt die Speicherinformationen des ndarray-Objekts zurück, einschließlich der folgenden Attribute:
| Attribute | Beschreibung |
|---|---|
| C_CONTIGUOUS (C) | Die Daten liegen in einem einzigen zusammenhängenden Speicherbereich im C-Stil. |
| F_CONTIGUOUS (F) | Die Daten liegen in einem einzigen zusammenhängenden Speicherbereich im Fortran-Stil. |
| OWNDATA (O) | Das Array besitzt den von ihm verwendeten Speicher, anstatt ihn von anderen Objekten auszuleihen. |
| WRITEABLE (W) | Der Datenbereich kann geschrieben werden; das Setzen dieses Werts auf False macht die Daten schreibgeschützt. |
| ALIGNED (A) | Die Daten und alle Elemente sind ordnungsgemäß an der Hardware ausgerichtet. |
| WRITEBACKIFCOPY (X) | Dieses Array ist eine Kopie eines anderen Arrays; wenn dieses Array freigegeben wird, wird sein Inhalt in das ursprüngliche Array zurückgeschrieben. |
Das veraltete UPDATEIFCOPY (U) ist der alte Name von WRITEBACKIFCOPY. Es wurde in NumPy 1.14 als veraltet markiert und ab NumPy 2.0 vollständig entfernt, daher sollte es nun nicht mehr verwendet werden.
C_CONTIGUOUS und F_CONTIGUOUS beschreiben die Reihenfolge, in der dieselben Daten im Speicher angeordnet sind. Für dasselbe zweidimensionale Array gibt es zwei typische Speichermethoden:
Beispiel
x = np.array([1, 2, 3, 4, 5])
print(x.flags)
Das Ausgabeergebnis ist:
C_CONTIGUOUS : True F_CONTIGUOUS : True OWNDATA : True WRITEABLE : True ALIGNED : True WRITEBACKIFCOPY : FalseWeitere Erweiterungen