NumPy für Datenwissenschaftler: Ein praktischer Leitfaden
NumPy für Datenwissenschaftler ist die grundlegende Python-Bibliothek für numerische Berechnungen: Sie stellt ndarray bereit, einen zusammenhängenden Speicherblock mit festem Typ, der vektorisierte Operationen über N Dimensionen hinweg unterstützt. NumPy wurde 2006 veröffentlicht und ist jetzt in der Version 2.x verfügbar. Es unterstützt Pandas, SciPy, Scikit-Learn und so ziemlich jeden wissenschaftlichen Python-Stack, mit denen Sie in Berührung kommen werden.
Wichtige Erkenntnisse
- Das Ndarray ist eine typisierte, schrittweise Ansicht über einen zusammenhängenden Puffer. Das Verständnis von Schritten und dtypes erklärt die meisten Leistungs- und Speicherüberraschungen, die Sie bei der Verwendung von NumPy für Datenwissenschaftler erleben werden.
- Die Vektorisierung übertrifft Python-Schleifen bei typischen numerischen Workloads um ein bis zwei Größenordnungen, jedoch nur, wenn die Operation auf die kompilierten Kernel von NumPy abgebildet wird.
- Beim Broadcasting handelt es sich um eine Reihe von Ausrichtungsregeln, nicht um Zauberei: Die Abmessungen werden von rechts nach links verglichen und müssen gleich oder 1 sein. – NumPy 2.0 hat den Standard-Integer-Typ unter Windows geändert und die Heraufstufungsregeln verschärft, sodass Code, der unter 1.26 stillschweigend funktionierte, den dtype ändern oder unter 2.x einen Fehler auslösen kann.
- Für tabellarische Arbeiten ist Pandas normalerweise die richtige Ebene; NumPy ist die richtige Ebene für Arrays, lineare Algebra, Signalverarbeitung und den numerischen Kern benutzerdefinierter Pipelines.
- Speicherlayout (C-Reihenfolge vs. Fortran-Reihenfolge) und Copy-vs-View-Semantik entscheiden darüber, ob ein 10-GB-Array in den RAM passt oder sich stillschweigend verdoppelt.
Was genau ist NumPy in der Datenwissenschaft?
Für einen NumPy-Ansatz für Datenwissenschaftler versteht man darunter am besten das Array-Substrat unter dem Rest des Stapels. Wenn Sie „pandas.DataFrame.to_numpy()“ aufrufen, einen Scikit-Learn-Schätzer trainieren oder einen Teil einer HDF5-Datei mit h5py lesen, landen die Daten in einem ndarray. Dieser einzelne Objekttyp – ein D-Typ, eine Form, ein Speicherpuffer – macht nachgelagerte Bibliotheken schnell und vorhersehbar.
Der Umfang der Bibliothek ist enger als Neulinge erwarten. NumPy führt keine beschrifteten Daten, Semantik fehlender Werte oder gruppierte Aggregation durch. Pandas tut es. NumPy führt keine Optimierung, Interpolation oder spärliche lineare Algebra durch; SciPy tut es. NumPy führt dichte N-dimensionale Arrays, elementweise Mathematik, Broadcasting, Reduktionen, Indizierung, Zufallszahlengenerierung und eine lineare Algebra-Schnittstelle zu BLAS und LAPACK durch. Wenn Sie wissen, wo diese Grenze liegt, vermeiden Sie den häufigen Fehler, Pandas in NumPy erneut zu implementieren.
Das ndarray: Drei Attribute, die alles erklären
Ein Ndarray wird durch drei Dinge beschrieben: „Shape“, „Dtype“ und „Strides“. Form ist die logische Dimensionalität. Dtype legt die Interpretation jedes Elements fest – „float64“, „int32“, „complex128“, „datetime64[ns]“ oder einen strukturierten Datensatz. Schritte geben den Byte-Offset zum Schritt für jede Achse an.
Schritte sind der Grund, warum „arr[::2]“ und „arr.T“ kostenlos sind. Beim Slicing mit einem Schritt oder beim Transponieren werden keine Daten verschoben; Es gibt eine neue Ansicht mit unterschiedlichen Schritten über denselben Puffer zurück.
Das Umformen eines C-zusammenhängenden Arrays ist ebenfalls eine Ansicht. Fancy Indexing („arr[[0, 5, 9]]“) und boolesche Maskierung weisen dagegen immer ein neues Array zu. In einer Pipeline, die Multi-Gigabyte-Arrays verarbeitet, ist der Unterschied zwischen einer Ansicht und einer Kopie der Unterschied zwischen Abschluss und Swapping.
Verwandte: — Projektbasierte Data-Science-Pfade mit geführtem Terminal und realen Datensätzen.
Eine praktische Angewohnheit bei der Verwendung von NumPy für Datenwissenschaftler-Aufgaben: Überprüfen Sie nach jeder nichttrivialen Indizierungsoperation „arr.base is None“, um zu sehen, ob Sie der Speicher besitzen, und „arr.flags[‘C_CONTIGUOUS’]“, um zu sehen, ob das Layout dem entspricht, was eine nachgeschaltete C- oder Fortran-Routine erwartet. Die eigene Dokumentation von NumPy zum internen Speicherlayout ist hier die maßgebliche Referenz.
Verwendung von NumPy in der Datenwissenschaft: Wo es tatsächlich seinen Platz verdient
Für einen Numpy-Workflow für Datenwissenschaftler erfolgt die Verwendung von NumPy in fünf wiederkehrende Aufgaben.
Numerische Vorverarbeitung im großen Maßstab. Das Standardisieren von Features, logarithmische Transformation von Zählwerten, das Beschneiden von Ausreißern und das Berechnen paarweiser Abstände sind alles elementweise oder Reduktionsoperationen. Wenn Sie sie auf einem Ndarray ausführen, wird der Python-Overhead pro Zeile vermieden.
Einen Blick wert: — Ein Abonnement für von der Universität unterstützte Python- und Data-Science-Zertifikate.
Lineare Algebra. Kleinste Quadrate, PCA über SVD, Kovarianzschätzung und das Lösen dichter Systeme laufen über „numpy.linalg“, das dieselben BLAS/LAPACK-Bibliotheken aufruft, die MATLAB und R verwenden. Ein gut abgestimmter OpenBLAS- oder MKL-Build kann um ein Vielfaches schneller sein als ein einfacher Build auf derselben Maschine.
Zufallssimulation. „numpy.random.default_rng()“ (die in NumPy 1.17 eingeführte Generator-API) liefert reproduzierbare, statistisch besser verhaltene Streams als das alte „RandomState“. Hier finden Monte-Carlo-Arbeiten, Bootstrap-Resampling und Permutationstests statt.
Schnittstellen zu Binärformaten. HDF5, NetCDF, Zarr und speicherzugeordnete Rohdateien stellen alle Array-ähnliche Schnittstellen bereit. Mit „np.memmap“ können Sie durch Paging von der Festplatte an einem Array arbeiten, das größer als RAM ist.
Verbindung zwischen Bibliotheken. Die Konvertierung zwischen Pandas, PyTorch und Xarray erfolgt normalerweise über NumPy. Aufgrund des Pufferprotokolls erfolgen diese Konvertierungen häufig ohne Kopie.
Ist NumPy wichtig für die Datenwissenschaft? Die ehrliche Antwort
NumPy ist für einen Datenwissenschaftler wichtig, weil es eine Abhängigkeit ist, und nicht, weil es immer die Schnittstelle ist, gegen die Sie schreiben. Ein arbeitender Datenwissenschaftler kann Monate damit verbringen, nicht direkt „import numpy as np“ einzugeben, und doch führt jede Pandas-Operation, jeder Scikit-Learn-Fit und jeder Matplotlib-Plot den darunter liegenden NumPy-Code aus.
Die Bedeutung ist strukturell. NumPy definiert die Array-API, auf die sich der Rest des Ökosystems einigt – eine Spezifikation, die jetzt als Python-Array-API-Standard formalisiert ist und es Bibliotheken wie CuPy, JAX und PyTorch ermöglicht, kompatible Schnittstellen bereitzustellen. Beim Erlernen von NumPy geht es daher weniger um das Auswendiglernen von Funktionen als vielmehr um das Erlernen des mentalen Modells, das auf jede Array-Bibliothek übertragen wird, die Sie später verwenden werden.
Wobei NumPy nicht die Antwort ist: stringlastiges ETL, Verknüpfungen über heterogene Tabellen, Zeitreihen-Resampling mit unregelmäßigen Zeitstempeln und alles, was eine verzögerte Auswertung über Datensätze erfordert, die nicht in den Speicher passen. Greifen Sie in diesen Fällen zu Pandas, Polars, DuckDB oder Dask.
Vektorisierung, Broadcasting und die Regeln, die beißen
Broadcasting vergleicht Formen von rechts. Zwei Dimensionen sind kompatibel, wenn sie gleich sind oder eine von ihnen 1 ist; Die Dimension Größe 1 wird ohne Kopieren gestreckt.
Eine „(1000, 3)“-Merkmalsmatrix minus einem „(3,)“-Mittelwertvektor funktioniert. Eine „(1000, 3)“-Matrix minus einem „(1000,)“-Vektor löst einen Fehler aus, weil die nachfolgenden Dimensionen 3 und 1000 nicht übereinstimmen – und die Korrektur fast immer „mean[:, None]“ und keine Schleife ist. Dies ist ein wichtiges Konzept in Numpy für die Arbeitsabläufe von Datenwissenschaftlern.
Im realen Code treten drei Fehlermodi auf:
- Zufällige äußere Produkte.
a[:, None] * b[None, :]auf zwei Vektoren mit 100.000 Elementen weist 10^10 Gleitkommazahlen zu. Das sind 80 GB bei float64. Teilen Sie es in Stücke oder verwenden Sie eine Formulierung, die sofort reduziert. - Integer-Überlauf. Die
np.int32-Arithmetik wird stillschweigend umbrochen. Das Summieren großer Zahlen in int32 ist eine klassische Quelle für negative Summen. - In-Place-Operationen für Ansichten.
arr[::2] += 1ändert den übergeordneten Puffer. Das ist oft das, was Sie wollen, und gelegentlich liegt ein Fehler vor, der ein zwischengespeichertes Array beschädigt.
Das richtige Tool auswählen: NumPy im Vergleich zu den Alternativen
| Aufgabe | Beste erste Wahl | Warum |
|---|---|---|
| Beschriftete Tabellendaten, Joins, Groupby | Pandas oder Polars | Indexausrichtung und Semantik fehlender Werte |
| Dichte numerische Arrays, lineare Algebra | NumPy | Direkter BLAS/LAPACK-Zugriff, minimaler Overhead |
| Arrays größer als RAM | Dask, Zarr oder „np.memmap“ | Geblockte oder ausgelagerte Ausführung |
| GPU-beschleunigte Array-Mathematik | CuPy oder JAX | NumPy-kompatible API, Geräteausführung |
| Sparse-Matrizen | SciPy „sparse“ | Speicher skaliert mit Nicht-Nullen |
| Autodiff und JIT für Forschungscode | JAX | Funktionale Transformationen über Array-Programme |
Die Entscheidungsregel: Wenn Ihre Daten aussagekräftige Zeilenbeschriftungen und gemischte Spaltentypen haben, beginnen Sie mit Pandas. Wenn es sich um einen homogenen numerischen Block handelt und Ihnen der Durchsatz am Herzen liegt, beginnen Sie mit NumPy – dem unverzichtbaren Tool von Numpy für Datenwissenschaftler. Wenn es nicht in den Speicher passt, beginnen Sie mit einem Chunk-Framework und legen Sie es innerhalb jedes Chunks auf NumPy ab.
Performance-Praktiken, die wirklich bewegen
Passen Sie dtype an das Problem an. „float32“ halbiert den Speicher und kann den Durchsatz auf Hardware mit 2:1 FP32:FP64-Verhältnissen verdoppeln, allerdings auf Kosten von etwa sieben Dezimalstellen an Genauigkeit. Bei iterativen Lösern und langen Simulationen häuft sich dieser Fehler; Für die anzeigeorientierte Vorverarbeitung ist es normalerweise in Ordnung.
Vorab zuweisen und abschließen. Durch das Erweitern von Arrays mit np.append in einer Schleife wird jede Iteration neu zugewiesen. Weisen Sie die Ausgabe einmal zu und weisen Sie sie in Blöcken zu.
Verwenden Sie „out=“, um temporäre Arrays zu vermeiden. „np.multiply(a, b, out=c)“ schreibt in den vorhandenen Speicher. In engen Schleifen über große Arrays wird dadurch der Zuordnungsdruck beseitigt und das Cache-Verhalten verbessert.
Reduzierungen gegenüber Materialisierung bevorzugen. „np.einsum“ und „np.dot“ drücken Kontraktionen aus, ohne Zwischenarrays zu erstellen. (a[:, None] * b[None, :]).sum(axis=1) und a * b.sum() berechnen dasselbe mit völlig unterschiedlichen Speicherprofilen.
Wissen Sie, wann Sie NumPy verlassen müssen. Bei elementweisen Funktionen mit Verzweigungen können Numba oder Cython vektorisiertes NumPy schlagen, da sie temporäre Arrays vollständig vermeiden. Bei allem, was eine Schleife auf Python-Ebene über Zeilen hat, ist die Schleife das Problem, nicht NumPy.
NumPy 2.x: Was sich geändert hat und warum es wichtig ist
NumPy 2.0, veröffentlicht im Juni 2024, ist der erste große Versionsschub seit 2006. Drei Änderungen wirken sich auf den Arbeitscode für die Numpy-Community für Datenwissenschaftler aus.
Der Standard-Ganzzahltyp unter Windows wurde von „int32“ auf „int64“ verschoben und entspricht damit Linux und macOS. NEP 50 hat die Typheraufstufung verschärft, sodass Python-Skalare Arrays nicht mehr auf überraschende Weise umwandeln – „np.float32(1) + 1.0“ bleibt jetzt float32. Und die C-API wurde neu organisiert, was die Binärkompatibilität beeinträchtigte: Erweiterungen, die mit 1.x kompiliert wurden, müssen neu erstellt werden.
Bei den meisten Analysecodes verläuft die Migration ereignislos, aber numerischer Code, der auf implizitem Upcasting basiert, kann die Ergebnisse in den letzten Bits ändern. Führen Sie Ihre Testsuite unter 2.x aus, bevor Sie eine Produktionsumgebung aktualisieren, und fixieren Sie Versionen in reproduzierbaren Forschungsartefakten. Die NumPy-Versionshinweise dokumentieren jede Änderung.
Hinweise zur Reproduzierbarkeit für Laborgruppen
Die reproduzierbare numerische Arbeit für eine Numpy für Datenwissenschaftler hängt von mehr als einem Startwert ab. Notieren Sie die NumPy-Version, die BLAS-Implementierung (OpenBLAS, MKL und Accelerate liefern unterschiedliche End-Bit-Ergebnisse für denselben Vorgang), die Thread-Anzahl und den D-Typ jedes Arrays, das eine veröffentlichte Abbildung speist. np.show_config() druckt die Build-Details.
Die Gleitkomma-Summierung ist nicht assoziativ, daher können parallele Reduktionen von Lauf zu Lauf unterschiedlich sein. Wenn ein Ergebnis bitidentisch sein muss, verwenden Sie „np.sum“ mit paarweiser Summierung in einem einzelnen Thread oder verwenden Sie explizit die Kahan-Summierung. Für gemeinsam genutzte Laborpipelines heften Sie NumPy in eine Sperrdatei und speichern Sie die Sperrdatei zusammen mit den Daten.
Quellen und weiterführende Literatur
- Datenwissenschaft – Wikipedia: Datenwissenschaft ist ein interdisziplinäres akademisches Gebiet, das Statistiken, wissenschaftliches Rechnen, wissenschaftliche Methoden, Verarbeitung, wissenschaftliche Visualisierung, Algorithmen usw. verwendet.
Häufig gestellte Fragen
Wofür wird NumPy in der Datenwissenschaft verwendet?
NumPy stellt das N-dimensionale Array und die vektorisierten Operationen bereit, auf denen die meisten wissenschaftlichen Python-Bibliotheken basieren. Datenwissenschaftler verwenden Numpy für Datenwissenschaftleraufgaben wie numerische Vorverarbeitung, lineare Algebra, Zufallssimulation und als Austauschformat zwischen Pandas, Scikit-Learn, PyTorch und Plotbibliotheken. Die direkte Verwendung ist in benutzerdefinierten Pipelines üblich; Die indirekte Nutzung ist universell.
Ist NumPy für die Datenwissenschaft wichtig, wenn ich hauptsächlich Pandas verwende?
Ja, weil Pandas numerische Spalten als NumPy-Arrays speichert und seine Mathematik an NumPy delegiert. Das Verständnis von Dtypes, Ansichten im Vergleich zu Kopien und Broadcasting erklärt die Leistung und das Speicherverhalten der meisten Pandas. Sie können produktiv sein, ohne NumPy direkt zu schreiben, aber Sie werden schneller debuggen, wenn Sie die darunter liegende Ebene verstehen.
Sollte ich zuerst NumPy oder Pandas lernen?
Lernen Sie zunächst NumPy, wenn Ihre Arbeit Simulationen, Signale, Bilder oder benutzerdefinierte numerische Algorithmen umfasst. Lernen Sie zuerst Pandas, wenn Ihre Arbeit eine tabellarische Analyse mit beschrifteten Spalten und gemischten Typen ist. In der Praxis machen ein paar Stunden NumPy – Arrays, Indizierung, Broadcasting, Reduzierungen – Pandas sofort weniger mysteriös.
Wie schnell ist NumPy im Vergleich zu reinen Python-Schleifen?
Vektorisierte NumPy-Operationen werden in der Regel ein bis zwei Größenordnungen schneller ausgeführt als entsprechende Python-Schleifen für dieselben Daten, da die innere Schleife in kompiliertem C ohne Interpreter-Overhead pro Element ausgeführt wird. Die Lücke wird kleiner oder kehrt sich um, wenn der Vorgang nicht vektorisiert werden kann, wenn die Arrays klein genug sind, dass der Aufruf-Overhead überwiegt, oder wenn die vektorisierte Form große Temporäre zuweist.
Verarbeitet NumPy fehlende Daten?
NumPy verfügt über „np.nan“ für Floats und „np.ma“ maskierte Arrays, bietet jedoch keine Semantik für fehlende Werte im Pandas-Stil über dtypes hinweg. Seit NumPy 1.24 ist „np.nan“ nur für Float- und komplexe Typen gültig und kann in Ganzzahl-Arrays nicht gespeichert werden. Für den echten Umgang mit fehlenden Daten verwenden Sie pandas nullable dtypes oder ein spezielles Framework.
Was hat sich in NumPy 2.0 geändert, das meinen Code beschädigen könnte?
NumPy 2.0 änderte die Windows-Standard-Ganzzahl in int64, übernahm NEP 50-Heraufstufungsregeln, sodass Python-Skalare Arrays nicht mehr heraufstufen, und organisierte die C-API neu, wodurch die Binärkompatibilität mit Erweiterungen, die für 1.x erstellt wurden, unterbrochen wurde. Der meiste Analysecode läuft unverändert, aber numerischer Code, der empfindlich auf die Dtype-Heraufstufung reagiert, sollte erneut getestet werden.
Häufig gestellte Fragen
Wofür wird NumPy in der Datenwissenschaft verwendet?
NumPy stellt das N-dimensionale Array und die vektorisierten Operationen bereit, auf denen die meisten wissenschaftlichen Python-Bibliotheken basieren. Datenwissenschaftler verwenden Numpy für Datenwissenschaftleraufgaben wie numerische Vorverarbeitung, lineare Algebra, Zufallssimulation und als Austauschformat zwischen Pandas, Scikit-Learn, PyTorch und Plotbibliotheken. Die direkte Verwendung ist in benutzerdefinierten Pipelines üblich; Die indirekte Nutzung ist universell.
Ist NumPy für die Datenwissenschaft wichtig, wenn ich hauptsächlich Pandas verwende?
Ja, weil Pandas numerische Spalten als NumPy-Arrays speichert und seine Mathematik an NumPy delegiert. Das Verständnis von Dtypes, Ansichten im Vergleich zu Kopien und Broadcasting erklärt die Leistung und das Speicherverhalten der meisten Pandas. Sie können produktiv sein, ohne NumPy direkt zu schreiben, aber Sie werden schneller debuggen, wenn Sie die darunter liegende Ebene verstehen.
Soll ich zuerst NumPy oder Pandas lernen?
Lernen Sie zunächst NumPy, wenn Ihre Arbeit Simulationen, Signale, Bilder oder benutzerdefinierte numerische Algorithmen umfasst. Lernen Sie zuerst Pandas, wenn Ihre Arbeit eine tabellarische Analyse mit beschrifteten Spalten und gemischten Typen ist. In der Praxis machen ein paar Stunden NumPy – Arrays, Indizierung, Broadcasting, Reduzierungen – Pandas sofort weniger mysteriös.
Wie schnell ist NumPy im Vergleich zu reinen Python-Schleifen?
Vektorisierte NumPy-Operationen werden in der Regel ein bis zwei Größenordnungen schneller ausgeführt als entsprechende Python-Schleifen für dieselben Daten, da die innere Schleife in kompiliertem C ohne Interpreter-Overhead pro Element ausgeführt wird. Die Lücke wird kleiner oder kehrt sich um, wenn der Vorgang nicht vektorisiert werden kann, wenn die Arrays klein genug sind, dass der Aufruf-Overhead überwiegt, oder wenn die vektorisierte Form große Temporäre zuweist.
Behandelt NumPy fehlende Daten?
NumPy verfügt über np.nan für Floats und np.ma-maskierte Arrays, bietet jedoch keine Semantik für fehlende Werte im Pandas-Stil über D-Typen hinweg. Seit NumPy 1.24 ist np.nan nur für Float- und komplexe Typen gültig und kann in Ganzzahl-Arrays nicht gespeichert werden. Für den echten Umgang mit fehlenden Daten verwenden Sie pandas nullable dtypes oder ein spezielles Framework.
Was hat sich in NumPy 2.0 geändert, das meinen Code beschädigen könnte?
NumPy 2.0 änderte die Windows-Standard-Ganzzahl in int64, übernahm NEP 50-Heraufstufungsregeln, sodass Python-Skalare keine Upcast-Arrays mehr durchführen, und organisierte die C-API neu, wodurch die Binärkompatibilität mit Erweiterungen, die für 1.x erstellt wurden, unterbrochen wurde. Der meiste Analysecode läuft unverändert, aber numerischer Code, der auf die Dtype-Heraufstufung anspricht, sollte erneut getestet werden.
Lernen Sie Python, indem Sie in Ihrem Browser programmieren
Interaktive Python- und Data-Science-Kurse, bei denen Sie direkt im Browser programmieren