Listen, Tupel und Dictionaries verwalten Massendaten in Python recht gut, aber NumPy kann es besser. Zeit für uns, diese Bibliothek kennenzulernen.
NumPy
NumPy ist eine Programmbibliothek zur effizienten Verwaltung von Massendaten in Arrays und bietet viele Methoden, diese zu manipulieren. Die Bibliothek ist mathematisch mit Vektoren und Matrizen der linearen Algebra verwandt.
virtuelle Umgebung einrichten
Zunächst richten wir uns eine virtuelle Umgebung für NumPy ein und installieren das numpy Paket:
virtualenv teil22
cd teil22
source bin/activate
pip install numpy
Es steht dir natürlich frei, eine bereits existierende Umgebung zu benutzen.
NumPy Array
Intern arbeitet NumPy mit sog. nd Arrays bald Datenstruktur (n-dimensional Array).
import numpy as np
simple_array = np.array([1,2,3,4,5,6])
print(f'simple_array={simple_array}')
print(f'ndim={simple_array.ndim}')
print(f'shape is {simple_array.shape}')
Jedes Programm, dass mit NumPy arbeitet, importiert das Modul mit import numpy as np
. Dies ist Konvention, da jeder sofort weiß, dass er über np.
auf die Funktionalität zugreifen kann. Nach dem Import erzeugen wir uns ein Array mit den ersten sechs natürlichen Zahlen simple_array = np.array([1,2,3,4,5,6])
. Genaugenommen übergeben wir eine Pythonliste an die Methode, die uns ein nd-Array zurückliefert.
Jedes Array besitzt zwei Attribute, die öfter mal gebraucht werden: ndmin
und shape
.
ndim
ndim ist die Anzahl der Dimensionen des Array, daher ist der Wert in diesem Beispiel 1
. Dies entspricht mathematisch einem Vektor.
shape
shape
gibt die Form des Array an. Bei einem Vektor, wie diesem, sind dies 6 Zeilen mit jeweils einem Wert.
dtype
Über dtype
kannst feststellen, welchen Datentyp die Elemente des Arrays haben. So lang du nichts anders angibst, sind sie immer int64
, also eine 64-bittige vorzeichenbehaftete Integerzahl. Willst du den Datentyp selbst festlegen, musst dies bei der Array Initialisierung explizit angeben: np.array([1,2,3,4,5],dtype='float32')
beispielsweise für eine 32 Bit Gleitkommazahl. Alle Elemente des Array haben bei NumPy immer denselben Datentyp.
zwei dimensionales Array
Erweitern wir den Vektor um eine Dimension, bilden wir eine Matrize
import numpy as np
twodim_array = np.array([[1,2,3,4,5],[1,4,9,16,25]])
print(f'twodim_array={twodim_array}')
print(f'ndim={twodim_array.ndim}')
print(f'shape is {twodim_array.shape}')
Dazu übergeben wir jetzt zwei Listen mit jeweils 5 Werten (die ersten fünf natürlichen Zahlen und deren Quadrate)
ndmin
ist wie erwartet jetzt gleich 2, shape
sagt, dass wir zwei Zeilen mit jeweils 5 Spalten im Array haben.
Array kopieren
Du musst aufpassen, wenn du eine Kopie eines Arrays erstellen willst:
org = np.array([1,2,3,4,5,6])
copy = org
In diesem Fall wird keine Kopie von org
erstellt, sondern copy
zeigt nur auf den gleichen Speicherbereich wie org. Wenn du in copy ein Arrayelement änderst, wird diese Änderung auch bei org passieren. Die korrekte Methode ist:
copy = org.copy()
Jetzt hast du eine von org unabhängige Kopie des Originals erstellt.
Zahlenreihen erzeugen
Mit NumPy rechnen
Wie in der linearen Algebra kannst mit NumPy auch mit Matrizen und Vektoren rechnen.
Du kannst die bekannten mathematischen Operationen auf ein NumPy Array anwenden. Sie beziehen sich immer auf alle Elemente im Array.
#encoding: utf-8
import numpy as np
# Array initialisieren
org = np.array([1,2,3,4,5,6])
# Ein paar Kopien anlegen
copy_sum = org.copy()
copy_mult = org.copy()
copy_diff = org.copy()
# Für die Division benötigen wir ein float64 Array!
copy_div = org.astype(np.float64).copy()
# Zu allen Elementen 2 dazuzählen
copy_sum += 2
print(f'copy_sum={copy_sum}')
# Alle Elemente mit 2 multiplizieren
copy_mult *= 2
print(f'copy_mult={copy_mult}')
# Von allen Elementen 1 abziehen
copy_diff -= 1
print(f'copy_diff={copy_diff}')
copy_div /=2
print(f'copy_div={copy_div}')
Das Programm legt für Addition, Differenz, Multiplikation und Division eine Kopie des ursprünglichen Array an. Bei der Division musst du aufpassen, da dabei nicht immer ganzzahlige Werte als Ergebnis entstehen können, die bei einem int32
Array zu einer Exception führen würden. Daher wird mit org.astype(np.float64)
das Array nach float64
umgewandelt und davon eine Kopie erstellt.
Wie immer findest du alle Source-Beispiele im Git-Repo
Statistische Funktionen von NumPy
Über eine Menge von Zahlen wollen Statistiker immer verschiedene Werte berechnen, die diese Menge auswerten.
#encoding: utf-8
import numpy as np
data = np.array([128,256,512,1024,2048,4096])
# Mittelwert
print(f'Mittelwert: {data.mean()}')
#Median
print(f'Median: {np.median(data)}')
#Standardabweichung
print(f'Standardabweichung: {data.std()}')
#kleinster Wert im Array
print(f'Minium: {data.min()}')
#größter Wert im Array
print(f'Maximum: {data.max()}')
#Perzentil
print(f'Percentile: {np.percentile(data,1)}')
Du siehst, dass NumPy eine umfangreiche Bibliothek zur Verwaltung von Massendaten ist. Bei weitere Bibliotheken wie z.B. Matplotlib und Pandas macht uns NumPy das Leben einfacher.
NumPy bietet auch noch Methoden zum Rechnen mit Matrizen, die lasse ich jetzt hier mal weg. Da der Post jetzt schon sehr umfangreich geworden ist.