NumPy – Python Tutorial Teil 22

Listen, Tupel und Dictionaries verwalten Massendaten in Python recht gut, aber NumPy kann es besser. Zeit für uns, diese Bibliothek kennenzulernen.

Python Logo (CC-BY-SA The people from the Tango! project / Wikipedia) numPy
Python Logo (CC-BY-SA The people from the Tango! project / Wikipedia)

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.

Ausgabe von simplearray.py mit ndmin=1, shape=(6,) und dtype=int64
Ausgabe von simplearray.py mit ndmin=1, shape=(6,) und dtype=int64

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)

Ausgabe von twodimarray.py mit ndmin=2,shape=(2,5) und dtype=int32
Ausgabe von twodimarray.py mit ndmin=2,shape=(2,5) und dtype=int32

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.

Schreibe einen Kommentar

WordPress Cookie Hinweis von Real Cookie Banner