Vorlesung: Computergestützte Datenauswertung Programmierung mit Python Günter Quast Fakultät für Physik Institut für Experimentelle Kernphysik KIT – Universität des Landes Baden-Württemberg und nationales Forschungszentrum in der Helmholtz-Gemeinschaft SS16 www.kit.edu PYTHON & friends Literatur: python für Anfänger: (= numpy, scipy, matplotlib) www.python­kurs.eu offizielles python Tutorial: http://docs.python.org/2/tutorial/ numpy tutorial: http://wiki.scipy.org/Tentative_NumPy_Tutorial numpy reference manual http://docs.scipy.org/doc/numpy/reference/index.html matplotlib tutorial: http://matplotlib.org/users/pyplot_tutorial.html advanced – for future python programmers: http://www.diveintopython.net/ ipython shell, an advanced interactive shell http://ipython.org/ipython-doc/stable/interactive/tutorial.html python appetizer http://docs.python.org/2/tutorial/ Die Python-Shell: ein interaktiver Taschenrechner Aufruf durch Befehl python auf der Kommando-Zeile: Beispiel ← multiple Zuweisung ← Kontrollstrukturen Python interaktiv: weitere Beispiele ← Definition einer Funktion Achtung: Einrückungen zwingend vorgeschrieben ← verschiedene Datenformate ← Typumwandlung nach float geht nicht, weil Unsinn ! ( abs(a) würde gehen - ausprobieren!) noch mehr Beispiele Funktion für Fibonacci-Zahlen ← Parameter mit Default und Name for-Schleife ← klassische Schleife über Index ← Iteration über Liste und noch ein Beispiel mehr zu Listen ← Erzeugen und Ausgabe einer Liste ← eine von vielen Funktionen ← komfortable Initialisierung ← Bereich aus Liste ← Filtern mit logischer Funktion ← Funktion auf alle Listenelemente Anm.: geht mit numpy-arrays auch einfacher letztes Beispiel dictionaries ← dictionary = key-value-Paare Python Scripte Alles, was wir bisher gesehen haben, lässt sich auch in Form einer Text-Datei als Python Script ausführen: > python Fibonacci.py Datei Fibonacci.py #! /usr/bin/env python #-- Fibonacci numbers as python script ------def Fibo(min=1, max=1000): a,b=0,1 while b<max: if b>=min: print b, a,b=b,a+b print '*==* Demo Script: Fibonacci numbers' print '\n calling Fibo(max=10000)' Fibo(max=10000) print '\n calling Fibo(10000,1000000)' Fibo(10000,1000000) erlaubt Ausführung direkt aus der Linux-Shell Achtung: Datei muss ausführbar sein: > chmod a+x Fibonacci.py Ausführung: > ./Fibonacci.py Python-Script (= Python-Programm) erlaubt: - Dokumentation - Weiterentwicklung/Modifikation - Wiederverwendung - Weitergabe von Code NumPy für Vektoren und Matrizen siehe http://wiki.scipy.org/Tentative_NumPy_Tutorial NumPy's NumPy'smain mainobject objectisisthe thehomogeneous homogeneousmultidimensional multidimensionalarray. array. ItItisisaatable of elements (usually numbers), all of the same type, table of elements (usually numbers), all of the same type, indexed indexed by byaatuple tupleof ofpositive positiveintegers. integers.In InNumpy Numpydimensions dimensionsare are called axes. The number of axes is rank. called axes. The number of axes is rank. NumPy NumPy ist ein fundamentales Paket zum wissenschaftlichen Rechnen in python – zentrales Datenobjekt ist array zur Handhabung von Vektoren und Matrizen aus homogenen Datentypen (im Gegensatz zu Listen!) – viele trigonometrische, hyperbolische und andere spezielle Funktionen sind implementiert – Rechenoperationen wirken auf ganze arrays, hohe Verarbeitungsgeschwindigkeit durch compilierten Code Beispiel: >>> import numpy as np ← Einbinden von numpy als alias „np“ >>> a=np.array([1,2,3,4],'f') >>> a array([ 1., 2., 3., 4.], dtype=float32) >>> b=np.array([0.5,1.,1.5,2.]) >>> b array([ 0.5, 1. , 1.5, 2. ]) >>> b­a ← element-weise Subtraktion array([­0.5, ­1. , ­1.5, ­2. ]) >>> der • in python bedeutet: np.array verwende Objekt array aus Paket numpy (alias np) ( • auch um Methoden von Klassen anzusprechen) Beispiele zu NumPy >>> import numpy as np >>> x = np.float32(1.0) >>> x 1.0 >>> y = np.array([1,2,4],'int') >>> y array([1, 2, 4]) >>> z = np.arange(3, 'uint8') >>> z array([0, 1, 2], dtype=uint8) numpy-arrays können mit verschiedenen Datentypen initialisiert werden allerdings enthält ein array immer Elemente vom gleichen Typ Datentypen: bool, int,int8,int16,int32 int64,uint8,uint16,uint32,uint64, float,float16,float32,float64, complex, complex64,complex128 >>> np.zeros(5) ← Initialisieren mit 0 array([ 0., 0., 0., 0., 0.]) >>> np.zeros((2,3)) ← 2-dim array array([[ 0., 0., 0.], [ 0., 0., 0.]]) ← Zahlen in Bereich mit Schrittweite >>> np.arange(2, 3, 0.1) array([ 2. , 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9]) >>> np.linspace(1., 4., 6) ← Zahlen in Bereich mit Anzahl, array([ 1., 1.6, 2.2, 2.8, 3.4, 4. ]) obere Grenze enthalten Zufall aus dem Computer numpy erlaubt es auch, Arrays (also Vektoren und Matrizen) mit Zufallszahlen zu füllen: gleichverteilte Zufallszahlen >>> np.random.rand() 0.466210425430829 >>> np.random.rand() 0.3937425857019299 >>> np.random.rand() gleiche Funktion, aber jedes mal eine andere Zahl ! 0.8586162430715967 >>> np.random.rand() 0.31812462303570166 >>> np.random.rand(3) array([ 0.43266661, 0.76177195, 0.60922989]) normal-verteilte Zufallszahlen >>> np.random.randn() 0.5224185337307578 >>> np.random.randn() 1.8467581564176467 >>> np.random.randn(2) array([-0.47682414, -0.59424037]) matplotlib für's Auge siehe http://www.matplotlib.org matplotlib user guide: „ making plots should be easy!“ Einfaches Beispiel numpy & matplotlib >>> >>> >>> >>> >>> >>> >>> >>> import numpy as np import matplotlib.pyplot as plt x=np.linspace(-20.,20.,200) y=np.sin(x)/x plt.plot(x,y) plt.show() matplotlib Grundlagen matplotlib einfügen import matplotlib.pyplot as plt Balkendiagramm h = [3., 5., 4., 2.] x = [1., 2., 3., 4.] plt.bar(x, y) Grafik anzeigen plt.show() Häufigkeitsverteilung Daten mit Fehlerbalken a = [1, 1, 2, 3, 3, 3, 4, 4] plt.hist(a, 4) x = [1., 2., 3., 4.] y = [3., 5., 4., 2.] e = 0.5 plt.errorbar(x, y, yerr=e, fmt='ro') Noch nicht sehr schön, aber das kriegen wir noch ... Falsche Daten # Messdaten = Model + Messfehler import numpy as np import matplotlib.pyplot as plt def model(x, a=1., b=0.5): return a*x+b numpy.random bietet Erzeugung von Zufallszahlen matplotlib (.pyplot.errorbar) erlaubt Darstellung von Datenpunkten mit Fehlerbalken # generate fake data according to model npoints, err =10, 1.3 xmin,xmax=1., 10. xm=np.linspace(xmin,xmax,npoints) ← Erzeugung normalverteilter dy=err*np.random.normal(size=npoints) ← Erzeugung von Zufallszahlen Zufallszahlen ym=model(xm)+dy (normalverteilt) # plot model dx=(xmax-xmin)/10. x=np.linspace(xmin-dx,xmax+dx,200) plt.plot(x,model(x),'r-') #plot fakde data ← Darstellung von Messplt.errorbar(xm,ym,yerr=err,fmt='bo') ← Darstellung von Datenpunkten plt.show() # display on screen punkten mit Fehlern mit Fehlerbalken Häufigkeiten sichtbar: Histogramm import numpy as np import matplotlib.pyplot as plt # generate random normal-distributed numbers data=np.random.normal(size=100) # plot data as historgram plt.hist(data,50,normed=1) plt.show() # put on screen numpy.random bietet Erzeugung von Zufallszahlen matplotlib (.pyplot.hist) bietet Erzeugung und Darstellung von Häufigkeitsverteilungen ← Häufigkeitsverteilung in 50 Intervallen noch schöneres Bild import numpy as np import matplotlib.pyplot as plt def fgauss(x,norm=1.,mu=0.,sigma=1.): # define Gauss-function return (norm*np.exp(-(x-mu)**2/2/sigma**2)/np.sqrt(2*np.pi)/sigma) data=np.random.normal(size=100) # generate Gaussian random data #plot function and data x = np.arange(-4., 4., 0.1) plt.plot(x, fgauss(x), 'r-') plt.hist(data,50,normed=1) # make plot nicer: plt.xlabel('x') # add labels plt.ylabel('probability density') plt.title('Gauss distribution') plt.figtext(0.6, 0.8 \ ,r'$f(x) = N(\mu=0.,\sigma=1.)$'\ ,fontsize=14, color='r') # nice formula plt.grid(True) # show a grid plt.show() # on screen ← mit LaTeX beschriftete Grafik höhere Mathematik: SciPy SciPy enthält viele weitere nützliche Pake für das wissenschaftliche Rechnen http://www.scipy.org -- spezielle Funktionen der mathematischen Physik – Statistik -- numerische Integration -- numerische Optimierung -- Interpolation -- Signalverarbeitung (incl. FFT) -- lineare Algebra – ... Es gibt noch viel zu entdecken ! Einfach ausprobieren ... Beste Methode: Beispiele – analysieren, – für eigene Zwecke anpassen, – weiterentwickeln.