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 = 1: horizontal arrow axis = 1 (axis 1) Horizontal direction, along each row axis = 0: vertical arrow axis = 0 (axis 0) Vertical direction, along each column Column index Column 0 Column 1 Column 2 Row index Row 0 Row 1 2×3 grid 1 2 3 4 5 6 Dashed-line association between rows and the shape card shape description card shape = (2, 3) 2 → length of axis 0 (number of rows) 3 → length of axis 1 (number of columns) Bottom attribute summary ndim = 2 (number of axes, i.e., rank) · size = 2 × 3 = 6 (total number of elements)

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

import numpy as np

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:

↓↓↓
1
2
3
4
5
6
5
7
9
→
6
→
15
a.sum(axis=0) → [5 7 9], die Elemente jeder Spalte entlang axis 0 zu einer Zahl komprimieren

Zu den wichtigeren Attributen des ndarray-Objekts in NumPy-Arrays gehören:

AttributeBeschreibung
ndarray.ndimDer Rang des Arrays, d. h. die Anzahl der Dimensionen oder die Anzahl der Achsen des Arrays.
ndarray.shapeDie 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.sizeDie Gesamtzahl der Elemente im Array, gleichndarray.shapedem Produkt der Größen jeder Achse in shape.
ndarray.dtypeDer Datentyp der Elemente im Array.
ndarray.itemsizeDie Größe jedes Elements im Array, in Bytes.
ndarray.flagsEnthä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.realDer Realteil jedes Elements im Array (wenn der Elementtyp komplex ist).
ndarray.imagDer Imaginärteil jedes Elements im Array (wenn der Elementtyp komplex ist).
ndarray.dataDer 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

import numpy as np

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

import numpy as np

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

import numpy as np

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

import numpy as np

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

import numpy as np

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

import numpy as np

# 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

import numpy as np

# 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

import numpy as np

# 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:

AttributeBeschreibung
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:

Left: C language style (row-major) C language style (row-major) Store row 0 completely, then row 1 123 456 Storage order indices: by row 1~6 1 2 3 4 5 6 Expand sequentially by row Memory: 1 2 3 4 5 6 123 456 1 2 3 4 5 6 012 345 Memory addresses (left to right) C_CONTIGUOUS : True Right: Fortran language style (column-major) Fortran language style (column-major) Store column 0 completely, then column 1 123 456 Storage order indices: by column 1~6 1 2 3 4 5 6 Expand sequentially by column Memory: 1 4 2 5 3 6 142 536 1 2 3 4 5 6 012 345 Memory addresses (left to right) F_CONTIGUOUS : True Bottom description NumPy arrays are stored in C language style (row-major) by default

Beispiel

import numpy as np

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 : False
Weitere Erweiterungen