Wenn man in Python effizient mit numerischen Daten (also Zahlen in großen Mengen, z. B. Messwerte, Vektoren oder Matrizen) arbeiten möchte, stößt man schnell auf die Grenzen der eingebauten Datentypen wie Listen. Listen sind sehr flexibel, aber nicht für Hochleistungsrechnen optimiert.
Hier kommt NumPy ins Spiel:
- NumPy steht für Numerical Python.
- Es ist die Basisbibliothek für numerische Berechnungen und Vektorisierung in Python.
- Fast alle Data-Science- und Machine-Learning-Frameworks (z. B. pandas, scikit-learn, TensorFlow, PyTorch) bauen darauf auf.
Warum NumPy? – Die Vorteile
- Geschwindigkeit: NumPy-Operationen sind in C implementiert → viel schneller als Python-Schleifen.
- Speichereffizienz: Daten werden in kompakten Arrays gespeichert, nicht als „Boxen“ wie in Python-Listen.
- Vektorisierung: Rechenoperationen lassen sich auf ganze Arrays anwenden, ohne Schleifen schreiben zu müssen.
- Mathematische Funktionen: Viele Standardfunktionen (Sinus, Logarithmus, Matrixoperationen) sind integriert.
Zentrale Konzepte
Array
Das Array ist der zentrale Datentyp von NumPy. Es ist vergleichbar mit einer Tabelle:
- 1D-Array: Liste von Zahlen (Vektor)
- 2D-Array: Tabelle (Matrix)
- 3D-Array und höher: Tensor (Datenwürfel mit mehr Dimensionen, z. B. Bilddaten)
👉 In NumPy spricht man von ndarray (n-dimensional array).
import numpy as np
# Ein einfaches 1D-Array
a = np.array([1, 2, 3, 4])
print(a) # [1 2 3 4]
print(a.shape) # (4,) → 4 Elemente in einer Dimension
# Ein 2D-Array (Matrix)
b = np.array([[1, 2], [3, 4]])
print(b)
# [[1 2]
# [3 4]]
print(b.shape) # (2, 2) → 2 Zeilen, 2 Spalten
Datentypen (dtype)
Jedes Array hat einen einheitlichen Datentyp (dtype). Das macht NumPy effizient.
Beispiele:
int32– Ganzzahlenfloat64– Fließkommazahlen (Standard in NumPy)bool– Wahr/Falsch
x = np.array([1, 2, 3], dtype=np.float32)
print(x.dtype) # float32
Broadcasting
Broadcasting ist ein Mechanismus, mit dem NumPy Arrays unterschiedlicher Größe „aneinander anpasst“.
Beispiel:
a = np.array([1, 2, 3])
b = 2
print(a * b) # [2 4 6]
Hier wird die Zahl 2 automatisch auf jedes Element von a „ausgedehnt“.
UFuncs (Universal Functions)
Viele NumPy-Operationen sind sogenannte UFuncs – das sind Funktionen, die auf Arrays elementweise angewendet werden.
Beispiele:
a = np.array([0, np.pi/2, np.pi])
print(np.sin(a)) # [0. 1. 0.]
print(np.log([1, np.e, np.e**2])) # [0. 1. 2.]
Shape & Dimensionen
Mit .shape und .ndim überprüfst du die Struktur eines Arrays:
a = np.array([[1, 2, 3],
[4, 5, 6]])
print(a.shape) # (2, 3) → 2 Zeilen, 3 Spalten
print(a.ndim) # 2 → zweidimensional
Typische Operationen in NumPy
Erzeugen von Arrays
np.zeros((2, 3)) # Array voller Nullen, 2 Zeilen, 3 Spalten
np.ones((3, 3)) # Array voller Einsen
np.arange(0, 10, 2) # [0, 2, 4, 6, 8]
np.linspace(0, 1, 5) # 5 gleichmäßig verteilte Werte zwischen 0 und 1
Rechnen mit Arrays
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(a + b) # [5 7 9]
print(a * b) # [ 4 10 18] (elementweise Multiplikation)
print(a.dot(b)) # 32 (Skalarprodukt)
Indexing & Slicing
Sehr ähnlich zu Python-Listen, aber leistungsfähiger:
a = np.arange(10) # [0 1 2 3 4 5 6 7 8 9]
print(a[0]) # 0
print(a[2:5]) # [2 3 4]
print(a[::-1]) # [9 8 7 6 5 4 3 2 1 0] (umgekehrt)
Bei 2D-Arrays:
b = np.array([[1, 2, 3],
[4, 5, 6]])
print(b[0, 1]) # 2 (erste Zeile, zweite Spalte)
print(b[:, 1]) # [2 5] (zweite Spalte komplett)