Numerisches Python - Arbeiten mit NumPy, Matplotlib und Pandas

Bernd Klein

Numerisches Python

Arbeiten mit NumPy, Matplotlib und Pandas

2023

464 Seiten

Format: PDF, ePUB

E-Book: €  29,99

E-Book kaufen

E-Book kaufen

ISBN: 9783446473669

 

3 NumPy – Einführung
3.1 Überblick

Bei NumPy handelt es sich um ein Modul, welches grundlegende Datenstrukturen, – d. h. mehrdimensionale Arrays und Matrizen, – und Funktionalitäten zur Verfügung stellt, die von zahlreichen anderen Modulen, unter anderem von Matplotlib, SciPy und Pandas, benutzt werden. Der Name NumPy stellt ein Akronym für den englischen Begriff „Numerical Python“ dar, also „numerisches Python“. Bei dem NumPy-Modul wurde von Anfang an besonderer Wert auf speicherschonende und schnelle Implementierungen gelegt, weshalb auch der größte Teil des Moduls in C geschrieben worden ist.

Bild 3.1 Visualisierung einer Matrix als Hinton-Diagramm

Dadurch wird sichergestellt, dass die kompilierten mathematischen und numerischen Funktionen und Funktionalitäten eine größtmögliche Ausführungsgeschwindigkeit garantieren. Python wird damit um mächtige Datenstrukturen erweitert und bereichert, die das effiziente Rechnen mit großen Arrays und Matrizen ermöglichen. Die Implementierung zielt sogar auf extrem große („Big Data“) Matrizen und Arrays. Ferner bietet das Modul eine riesige Anzahl von hochwertigen mathematischen Funktionen, um mit diesen Matrizen und Arrays zu arbeiten.

SciPy (Scientific Python, also wissenschaftliches Python) wird oft im gleichen Atemzug wie NumPy genannt. SciPy erweitert die Leistungsfähigkeit von NumPy um weitere nützliche Funktionen wie zum Beispiel Minimierung, Regression, Fourier-Transformation und viele andere.

Sowohl NumPy als auch SciPy sind üblicherweise bei einer Standardinstallation von Python nicht installiert. NumPy sowie all die anderen erwähnten Module sind jedoch Bestandteil der Anaconda-Distribution. Will man NumPy manuell installieren, sollte man beachten, dass es als Erstes installiert wird, also vor SciPy.

Das Diagramm in Bild 3.1 wurde übrigens auch mit Python unter Benutzung von NumPy und Matplotlib erzeugt. Das Bild stellt eine grafische Visualisierung einer Matrix mit 14 Reihen und 20 Spalten dar. Es handelt sich um ein sogenanntes Hinton-Diagramm. Die Größe eines Quadrates innerhalb dieses Diagramms korrespondiert zu der Größe des entsprechenden Wertes in der darzustellenden Matrix. Die Farbe bestimmt dabei, ob es sich um einen positiven oder negativen Wert handelt. In unserem Beispiel: Die Farbe Rot bezeichnet die negativen Werte, und die Farbe Grün bezeichnet die positiven Werte.

NumPy basiert auf zwei früheren Python-Modulen, die mit Arrays zu tun hatten. Eines von diesen ist Numeric. Numeric ist wie NumPy ein Python-Modul für leistungsstarke numerische Berechnungen, aber es ist heute überholt. Ein anderer Vorgänger von NumPy ist Numarray, bei dem es sich um eine vollständige Überarbeitung von Numeric handelt, aber auch dieses Modul ist heute veraltet. NumPy ist die Verschmelzung dieser beiden, d. h. es ist auf dem Code von Numeric und den Funktionalitäten von Numarray aufgebaut.

3.2 Vergleich NumPy-Datenstrukturen und Python

Die Datenstrukturen des reinen Python, also ohne NumPy und andere, bieten große Vorteile.

Vorteile von Python-Datenstrukturen:

       Integers und Floats sind als mächtige Klassen implementiert. So können Integer-Zahlen beinahe „unendlich“ groß oder klein werden.1

       Listen bieten effiziente Methoden zum Einfügen, Anhängen und Löschen von Elementen.

       Dictionaries bieten einen schnellen Lookup.

Vorteile von NumPy-Datenstrukturen gegenüber Python:

       Array-basierte Berechnungen

       Effizient implementierte mehrdimensionale Arrays

       Entworfen für wissenschaftliche Berechnungen

3.3 Ein einfaches Beispiel

Wie bei allen anderen Modulen müssen wir auch NumPy importieren, bevor wir mit dem Modul arbeiten können:

import numpy

NumPy wird aber nur selten in dieser Form importiert. Meistens wird es beim Import in umbenannt, um sich bei der Benutzung ein wenig Schreibarbeit zu sparen:

import numpy as np

In unserem ersten einfachen NumPy-Beispiel geht es um Temperaturen. Wir definieren eine Liste mit Temperaturwerten in Celsius:

cvalues = [20.8, 21.9, 22.5, 22.7, 22.3, 21.0, 21.2, 20.9, 20.1]

Aus unserer Liste erzeugen wir nun ein eindimensionales NumPy-Array:

C = np.array(cvalues) print(C)

Ausgabe:

[20.8 21.9 22.5 22.7 22.3 21. 21.2 20.9 20.1]

Nun wollen wir die obigen Temperaturwerte in Grad Fahrenheit umrechnen. Dies kann sehr einfach mit einem NumPy-Array bewerkstelligt werden. Die Lösung unseres Problems besteht in einfachen skalaren Operationen:

print(C * 9 / 5 + 32)

Ausgabe:

[69.44 71.42 72.5 72.86 72.14 69.8 70.16 69.62 68.18]

Das Array C selbst wurde dabei jedoch nicht verändert:

print(C)

Ausgabe:

[20.8 21.9 22.5 22.7 22.3 21. 21.2 20.9 20.1]

Verglichen zu diesem Vorgehen stellt sich die bestmöglich reine Python-Lösung2, die die Liste mithilfe einer Listen-Abstraktion in eine Liste mit Fahrenheit-Temperaturen wandelt, als umständlich dar!

fvalues = [x * 9 / 5 + 32 for x in cvalues] print(fvalues)

Ausgabe:

[69.44, 71.42, 72.5, 72.86, 72.14, 69.8, 70.16, 69.62, 68.18]

Wir haben bisher C als ein Array bezeichnet. Die interne Typbezeichnung lautet jedoch oder noch genauer „C ist eine Instanz der Klasse “:

print(type(C))

Ausgabe:

Im Folgenden werden wir die Begriffe „Array“ und „“ meistens synonym verwenden.

3.4 Grafische Darstellung der Werte

Obwohl wir das Modul Matplotlib erst später im Detail besprechen werden, wollen wir zeigen, wie wir mit diesem Modul die obigen Temperaturwerte ausgeben können. Dazu benutzen wir das Paket aus . Wenn man mit dem Jupyter-Notebook arbeitet3, empfiehlt es sich, die folgende Codezeile zu verwenden, falls der Plot nicht so wie im Buch erscheint:

%matplotlib inline

Dies ist meistens die Default-Einstellung. Sollen die Plots in einem Notebook in externen Fenstern auftauchen, schreibt man obige Zeile ohne , also nur .

Der Code zum Erzeugen eines Plots für unsere Werte sieht wie folgt aus:

import matplotlib.pyplot as plt plt.plot(C)

Die Funktion benutzt das Array C als Werte für die Ordinate, also die Y-Achse. Als Werte für die Abszisse wurden die Indizes des Arrays C genommen.

3.5 Speicherbedarf

Die wesentlichen Vorteile von NumPy-Arrays sind ein geringer Speicherverbrauch und ein optimales Laufzeitverhalten. Wir wollen uns den Speicherverbrauch von NumPy-Arrays in diesem Kapitel unseres Tutorials näher anschauen und ihn mit dem Speicherverbrauch von Python-Listen vergleichen.

Um den Speicherverbrauch der Liste aus dem vorigen Bild zu berechnen, werden wir die Funktion aus dem Modul benutzen:

from sys import getsizeof as size lst = [24, 12, 57] size_of_list_object = size(lst) # nur die grüne Box size_of_elements = len(lst) * size(lst[0]) # 24, 12, 57 total_list_size = size_of_list_object + size_of_elements print("Größe ohne Größe der Elemente: ", size_of_list_object) print("Größe aller Elemente: ", size_of_elements) print("Gesamtgröße der Liste: ", total_list_size)

Ausgabe:

Größe ohne Größe der Elemente: 120 Größe aller Elemente: 84 Gesamtgröße der Liste: 204

Der Speicherbedarf einer Python-Liste besteht aus der Größe der allgemeinen Listeninformation, dem Speicherbedarf für die Referenzen auf die Listenelemente und der Größe aller Elemente der Liste. Wenn wir auf eine Liste anwenden, erhalten wir nur den Speicherbedarf der reinen Liste ohne die Größe der Listenelemente. Im obigen Beispiel sind wir davon ausgegangen, dass alle Integer-Elemente unserer Liste die gleiche Größe haben. Dies stimmt natürlich nicht im allgemeinen Fall, da Integers bei...

 

© 2009-2024 ciando GmbH