Arrays erstellen
Ein Array enthält Werte eines Typs in einem Raster mit beliebig vielen Dimensionen.
| Aufgabe | Code |
|---|
| NumPy importieren | import numpy as np |
| Aus einer Liste | np.array([1, 2, 3]) |
| 2D aus verschachtelten Listen | np.array([[1, 2, 3], [4, 5, 6]]) |
| Nullen, Einsen, ein Füllwert | np.zeros((2, 3)), np.ones(4), np.full((2, 2), 7) |
| Bereich mit Schrittweite (ohne Ende) | np.arange(0, 10, 2) # [0 2 4 6 8] |
| n gleichmäßig verteilte Punkte (mit Ende) | np.linspace(0, 1, 5) # [0. 0.25 0.5 0.75 1.] |
| Einheitsmatrix | np.eye(3) |
| Gleiche Form wie ein anderes Array | np.zeros_like(m), np.ones_like(m) |
| Elementtyp wählen | np.array([1, 2, 3], dtype=np.float32) |
| Koordinatengitter | xx, yy = np.meshgrid(np.arange(3), np.arange(2)) |
Array untersuchen
| Aufgabe | Code |
|---|
| Shape: Größe jeder Dimension | m.shape # (3, 4) |
| Anzahl der Dimensionen | m.ndim # 2 |
| Anzahl der Elemente | m.size # 12 |
| Elementtyp | m.dtype # int64 |
| Typ umwandeln | m.astype(np.float64) |
| Länge der ersten Dimension | len(m) # 3 |
| Zurück zur Python-Liste | m.tolist() |
| Weniger Nachkommastellen ausgeben | np.set_printoptions(precision=3, suppress=True) |
Indexieren und slicen
Slices sind Views: Sie teilen sich den Speicher mit dem Original-Array. Masken und Indexlisten geben Kopien zurück.
| Aufgabe | Code |
|---|
| Erstes und letztes Element | a[0], a[-1] |
| Slice start:stop (ohne stop) | a[1:4] # [20 30 40] |
| Jedes zweite Element, umgekehrt | a[::2], a[::-1] |
| Ein Element eines 2D-Arrays | m[1, 2] # 6 |
| Eine Zeile, eine Spalte | m[0], m[:, 1] |
| Block aus Zeilen und Spalten | m[:2, 1:3] |
| Elemente, die eine Bedingung erfüllen | a[a > 25] # [30 40 50] |
| Bedingungen kombinieren | a[(a > 15) & (a < 45)] |
| Über eine Liste von Positionen wählen | a[[0, 2, 4]] |
| Passende Positionen | np.flatnonzero(a > 25) # [2 3 4] |
| Pro Element auswählen | np.where(a > 25, a, 0) |
| Vor dem Ändern eines Slice kopieren | part = a[1:3].copy() |
| Werte per Maske setzen | a[a > 40] = 0 |
Rechnen und Broadcasting
Operatoren arbeiten elementweise. Broadcasting streckt einen Skalar, eine Zeile oder eine Spalte auf die Form des anderen Arrays.
| Aufgabe | Code |
|---|
| Elementweise Arithmetik | x + y, x - y, x * y, x / y, x ** 2 |
| Mit einem Skalar | x * 10 |
| Wurzel, Exponent, Logarithmus | np.sqrt(x), np.exp(x), np.log(x) |
| Betrag, Runden | np.abs(x - 5), np.round(x / 3, 2) |
| Werte auf einen Bereich begrenzen | np.clip(x, 2, 8) |
| Elementweises Maximum | np.maximum(x, 3) |
| Skalarprodukt | x @ y # 37.0 |
| Jede Spalte zentrieren (Zeile broadcasten) | m - m.mean(axis=0) |
| Jede Zeile skalieren (Spalte broadcasten) | m / m.sum(axis=1, keepdims=True) |
| Floats sicher vergleichen | np.isclose(0.1 + 0.2, 0.3) # True, np.allclose(x, y) |
| Trigonometrie und Pi | np.sin(np.pi / 2) # 1.0 |
Entlang einer Achse aggregieren
axis=0 läuft die Zeilen hinunter und liefert ein Ergebnis pro Spalte. axis=1 läuft quer über die Spalten und liefert ein Ergebnis pro Zeile.
| Aufgabe | Code |
|---|
| Summe aller Elemente | m.sum() # 21 |
| Ein Ergebnis pro Spalte | m.sum(axis=0) # [5 7 9] |
| Ein Ergebnis pro Zeile | m.sum(axis=1) # [ 6 15] |
| Mittelwert und Standardabweichung | m.mean(), m.std(), m.mean(axis=0) |
| Minimum, Maximum | m.min(), m.max(axis=1) |
| Position des Maximums | m.argmax(), m.argmax(axis=1) |
| Median und Perzentile | np.median(m), np.percentile(m, [25, 50, 75]) |
| Laufende Summe | np.cumsum(m, axis=1) |
| Produkt aller Elemente | m.prod() # 720 |
| Any, all, zählen | (m > 4).any(), (m > 0).all(), np.count_nonzero(m > 2) |
Umformen und kombinieren
Ein reshape behält die Elemente und ändert nur die Form, die Gesamtgröße muss also gleich bleiben.
| Aufgabe | Code |
|---|
| Neue Form | a.reshape(2, 3) |
| Eine Größe von NumPy berechnen lassen | a.reshape(3, -1), a.reshape(-1, 1) |
| Zu 1D flach machen | m.ravel(), m.flatten() |
| Transponieren | m.T |
| Dimension hinzufügen | a[:, np.newaxis], np.expand_dims(a, axis=0) |
| Dimensionen der Größe 1 entfernen | np.squeeze(np.ones((1, 3, 1))) |
| Entlang einer vorhandenen Achse verbinden | np.concatenate([a, a]) |
| Zeilen oder Spalten stapeln | np.vstack([m, m]), np.hstack([m, m]) |
| 1D-Arrays als Spalten | np.column_stack([a, a ** 2]) |
| Entlang einer neuen Achse stapeln | np.stack([a, a], axis=0) # shape (2, 6) |
| In Teile aufteilen | np.split(a, 3), np.array_split(a, 4) |
| Wiederholen oder kacheln | np.repeat([1, 2], 2) # [1 1 2 2], np.tile([1, 2], 2) # [1 2 1 2] |
Sortieren, suchen und eindeutige Werte
| Aufgabe | Code |
|---|
| Sortierte Kopie | np.sort(a) |
| Größte zuerst | np.sort(a)[::-1] |
| Positionen in sortierter Reihenfolge | np.argsort(a) |
| Die drei größten Werte | np.sort(a)[-3:] |
| Eindeutige Werte und ihre Anzahl | values, counts = np.unique(a, return_counts=True) |
Namen in NumPy 2 (unique_values evtl. unsortiert) | np.unique_values(a), np.unique_counts(a) |
| Ist jedes Element in einer Liste? | np.isin(a, [1, 9]) |
| Einfügeposition in sortiertem Array | np.searchsorted([1, 3, 5, 7], 4) # 2 |
| Mengenoperationen | np.intersect1d(a, [1, 2, 10]), np.union1d(a, [10]), np.setdiff1d(a, [1]) |
| Zeilen nach einer Spalte sortieren | m[m[:, 1].argsort()] |
Zufallszahlen
Erstelle einen Generator mit Seed und ziehe alles daraus, dann wiederholen sich die Ergebnisse bei jedem Lauf.
| Aufgabe | Code |
|---|
| Generator mit Seed | rng = np.random.default_rng(42) |
| Floats in [0, 1) | rng.random(3) |
| Ganzzahlen, oberes Ende ausgeschlossen | rng.integers(1, 7, size=10) |
| Normalverteilung | rng.normal(loc=0, scale=1, size=(2, 3)) |
| Gleichverteilte Floats in einem Bereich | rng.uniform(5, 10, size=4) |
| Aus einer Liste ziehen | rng.choice(["a", "b", "c"], size=5) |
| Ohne Wiederholung ziehen | rng.choice(10, size=3, replace=False) |
| Mit Gewichten ziehen | rng.choice(["H", "T"], size=10, p=[0.7, 0.3]) |
| Gemischte Kopie, in place mischen | rng.permutation(a), rng.shuffle(a) |
| Binomial- und Poisson-Zählwerte | rng.binomial(10, 0.5, size=5), rng.poisson(3, size=5) |
Lineare Algebra
| Aufgabe | Code |
|---|
| Matrixprodukt | A @ A |
| Ax = b lösen | np.linalg.solve(A, b) # [0.8 1.4] |
| Inverse und Determinante | np.linalg.inv(A), np.linalg.det(A) |
| Vektorlänge | np.linalg.norm(b) |
| Eigenwerte und Eigenvektoren | values, vectors = np.linalg.eig(A) |
| Gerade anpassen | slope, intercept = np.polyfit(x, y, 1) |
| Äußeres Produkt | np.outer([1, 2], [3, 4]) |
| Diagonale und Spur | np.diag(A), np.trace(A) |
Fehlende und spezielle Werte
np.nan markiert einen fehlenden Float. Jede Rechnung damit ergibt nan, also nutze die nan Funktionen oder eine Maske.
| Aufgabe | Code |
|---|
| Fehlender Wert | np.nan |
| Fehlende Werte finden | np.isnan(v), np.isnan(v).sum() |
| Fehlende Werte entfernen | v[~np.isnan(v)] |
| Fehlende und unendliche Werte ersetzen | np.nan_to_num(v, nan=0.0, posinf=0.0) |
| Auf unendlich und endlich prüfen | np.inf, np.isfinite(v) |
| Statistiken, die NaN überspringen | np.nanmean(v[:3]) # 2.0, np.nanmax(v) |
Speichern und laden
| Aufgabe | Code |
|---|
| Ein Array, Binärdatei | np.save("data.npy", m), m = np.load("data.npy") |
| Mehrere Arrays in einer Datei | np.savez("data.npz", x=x, y=y), np.load("data.npz")["x"] |
| CSV-Text schreiben | np.savetxt("data.csv", m, delimiter=",", fmt="%d") |
| CSV-Text lesen | np.loadtxt("data.csv", delimiter=",") |
NumPy 2: alte Namen und was du jetzt schreibst
NumPy 2 hat viele Aliase entfernt, darum kann Code aus älteren Tutorials mit einem AttributeError fehlschlagen.
| Aufgabe | NumPy 2 | Alte Schreibweise |
|---|
| Fehlender Wert | np.nan | np.NaN |
| Unendlich | np.inf | np.Inf |
| 64-Bit-Float-Typ | np.float64 | np.float_ |
| Fläche unter einer Kurve | np.trapezoid(y, x) | np.trapz(y, x) |
| Ist jedes Element in einem anderen Array? | np.isin(a, b) | np.in1d(a, b) |
| Zeilen stapeln | np.vstack([a, a]) | np.row_stack([a, a]) |
| Produkt | np.prod(a) | np.product(a) |
| Zufallszahlen | rng = np.random.default_rng(0)
rng.random(3) | np.random.seed(0)
np.random.rand(3) |
Die NumPy-Aufrufe, auf denen Data-Science-Code aufbaut, sortiert nach Aufgabe: Arrays erstellen und untersuchen, indexieren und slicen, elementweise rechnen, entlang einer Achse aggregieren, umformen und kombinieren, sortieren und suchen, Zufallszahlen ziehen und lineare Algebra lösen. Jede Zeile ist ein kurzes Snippet zum Einfügen, plus eine Zeile dazu, was es tut.
Alles hier ist für NumPy 2 geschrieben, die Version, die Coddy verwendet, und die letzte Tabelle listet die Namen, die NumPy 2 entfernt hat, neben dem, was du stattdessen schreibst. Die meisten Beispiele verwenden a = np.array([3, 1, 4, 1, 5, 9, 2, 6]) und m = np.arange(12).reshape(3, 4). Neu in Python? Starte mit dem Python Spickzettel und dem Python Playground, und halte die Spickzettel zu pandas, Matplotlib und scikit-learn neben diesem bereit.