Programmieren in Python - Grundlagen Klaus Rheinberger 2017 Inhaltsverzeichnis Vorwort 1 Installation 1.1 Anaconda . . . 1.2 Pakete . . . . . 1.3 Updates . . . . 1.4 Zusatzsoftware 2 . . . . 3 3 4 4 4 2 Hilfe 2.1 Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Python Cheat Sheet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 4 5 3 Jupyter Notebooks 3.1 Starten . . . . . . . . . . . . . . . 3.2 Beenden . . . . . . . . . . . . . . . 3.3 Zellen . . . . . . . . . . . . . . . . 3.4 Exportieren . . . . . . . . . . . . . 3.5 Navigationsbefehle im Dateisystem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 6 7 7 4 Datentypen 4.1 Überblick über Standardtypen 4.2 Boolean . . . . . . . . . . . . . 4.3 Numeric Types . . . . . . . . . 4.4 Sequences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 7 8 8 9 5 Matrizenrechnung 5.1 Vektoralgebra: 1-dimensionale arrays . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Matrixalgebra: 2-dimensionale arrays . . . . . . . . . . . . . . . . . . . . . . . . . 11 12 13 6 Grafiken 6.1 Passive Grafiken: matplotlib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2 Interaktive Grafiken: ipywidgets . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 15 17 7 Funktionen 7.1 Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2 Beispiel 1: Hello . . . ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3 Beispiel 2: Fahrzeug auf ebener Fahrbahn . . . . . . . . . . . . . . . . . . . . . . 17 17 17 17 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Kontrollstrukturen 8.1 if else Abfrage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2 for Schleife . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3 while Schleife . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 19 20 21 9 Daten-IO 9.1 NumPy Befehle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.2 Pickle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 22 23 10 Literatur und Links 10.1 Leitfaden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2 Literaturverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 24 24 Vorwort Folgende Lehrveranstaltungen im Masterstudiengang Energietechnik und Energiewirtschaft verwenden die Programmiersprache Python zusammen mit ausgewählten Paketen (insbesondere SciPy) und der webbasierten Oberfläche Jupyter: • • • • • Angewandte Mathematik Aufbaukurs Data Science Erneuerbare Energien Technische Mathematik In Masterarbeiten wird Python ebenfalls oft verwendet. Python: Python ist eine leicht zu erlernende, effiziente Programmiersprache, die folgende weitere Vorteile bietet: • plattformunabhängig: Python-Programme laufen unter Linux, Windows und Mac OS, BSD etc. • frei erhältlich: siehe z. B. Python Software Foundation License FAQ • weit verbreitet: Es gibt sehr viele Tutorials, Videos, Foren, Bücher etc. • viele Pakete: Der Python Package Index umfasst derzeit (2017-09-06) 116307 Pakete. “Es gibt kaum etwas, das man mit Python nicht bauen könnte - solange es Software ist natürlich.” (Zitat Franz Geiger, FHV) Der Name bezieht sich übrigens auf die englische Komikergruppe Monty Python. SciPy: SciPy umfasst die Pakete • NumPy: Matrizenrechnung, lineare Algebra • SciPy library: Integralrechnung, Optimierung, Interpolation, Fourier, Signalanalyse, lineare Algebra, Statistik, Bilderverarbeitung • Matplotlib: 2D-Grafiken • IPython: interaktives Programmieren mit Python • Sympy: symbolische Mathematik (im Gegensatz zu numerischer Mathematik) • Pandas: Datenanalyse 2 SciPy stellt dadurch eine attraktive Alternative zu kommerziellen Produkten wie Matlab und Mathematica dar. Jupyter: Jupyter ist eine Webapplikation, die das Arbeiten mit sogenannten Jupyter Notebooks ermöglicht. In Jupyter Notebooks können Sie neben Code (nicht nur Python) auch formatierten Text, Links, Bilder, Videos und interaktive Widgets generieren, laufen lassen und exportieren. Neben der modernen Jupyter-Umgebung kann man Python auch im klassichen Interface “Editor + Command Line” verwenden, z. B. mit Spyder. Inhalte: Grundlagen: • • • • • • • • Installation und Hilfe Juypter Notebooks Datentypen Matrizenrechnung Grafiken Funktionen Kontrollstrukturen Daten-IO Vertiefende Themen: • Lineare Optimierung • Datenmanagement mit Pandas zusätzliche Unterlagen: Auf der Webseite finden Sie zusätzliche Unterlagen: Abbildungen, Daten, Code. Notation: • Als Dezimaltrennzeichen wird der englische Punkt statt dem deutschen Komma verwendet, da dies auch in der verwendeten Programmiersprache der Fall ist und zu keinen Verwechslungen mit Kommas bei der Angabe von Vektoren und Intervallen führt. • Python-Code ist wie folgt formatiert: r = sqrt(t) phi = pi*t 1 Installation 1.1 Anaconda Es gibt einige Möglichkeiten, Python und Python-Pakete zu installieren. Wir verwenden die Python-Distribution Anaconda. Laden Sie unter www.anaconda.com/download Anaconda für Ihre Plattform (Linux, Mac, Windows) die Python-Version >=3.6 herunter, und installieren Sie diese wie in der Installationshilfe angegeben. 3 1.2 Pakete Zusätzliche (zu den bereits mitinstallierten) Pakete können Sie mit Anaconda in einem SystemTerminal oder dem Anaconda Command Prompt (=Anaconda-Kommandozeile) mit dem Befehl conda install <Paketname> installieren, wobei <Paketname> durch den Namen des Pakets zu ersetzen ist. Alternativ können Sie die Anaconda Navigator Oberfläche verwenden. Eine Auflistung aller Python Pakete finden Sie im Python Package Index. 1.3 Updates Sie können die in Anaconda installierten Pakete in einem System-Terminal oder auf der AnacondaKommandozeile mit dem Befehl conda update --all updaten. Alternativ können Sie die Anaconda Navigator Oberfläche verwenden. 1.4 Zusatzsoftware Zum Konvertieren von Jupyter Notebooks zu pdf-Dateien müssen auf Ihrem Computer • eine TeX-Distribution, z. B. TeX Live, und • Pandoc installiert sein. 2 Hilfe 2.1 Links Im Internet finden Sie viele Unterlagen. Die folgende Liste ist nur eine kleine und persönliche Auswahl: • • • • • • • • • • • A Crash Course in Python for Scientists SciPy Lecture Notes Notebook Gallery www.tutorialspoint.com/python PythonLearn: textbook, exercises, code, videos etc. video2brain: Python 3 - Grundlagen: Zugang via FHV-Login Zur Formatierung der Markdown-Zellen im Jupyter-Notebook: Markdown-Cheatsheet NumPy for Matlab users IPython Jupyter Jupyter Docs 4 2.2 Python Cheat Sheet Da man sich nicht alle Befehle merken kann oder will, gibt es zu Programmiersprachen oft sogenannte cheat sheets. Für unsere Zwecke enthält das folgende Python Cheat Sheet einige oft gebrauchte Befehle: python_cheat_sheet_v3.pdf 3 Jupyter Notebooks 3.1 Starten Unter Windows und Mac können Sie Jupyter Notebook aus dem Start-Menü oder dem Anaconda Navigator starten. Ein Notebook Server startet anschließend in einem neu geöffneten System-Terminal. Auf allen Betriebssystemen können Sie im Anaconda Command Prompt oder einem SystemTerminal den Befehl jupyter notebook direkt zum Start eines Notebook Servers verwenden. Ihr Default-Browser öffnet sich, falls er nicht schon geöffnet war, und das Jupyter-Dashboard erscheint in einem neuen Browser-Tab. Sie können nun z.B. • • • • • • das Arbeitsverzeichnis ändern neue Notebooks erstellen und starten Notebooks herunterfahren Ordner erstellen und löschen Textdateien editieren Dateien löschen Achtung: Verwenden Sie generell für Ordner- und und Dateinamen keine Umlaute, keine Sonderzeichen und keine Leerzeichen! Wenn Sie ein (neues) IPython-Notebook - das ist eine ipynb-Datei - starten, öffnet sich ein neuer Tab und ein IPython-Kernel wird gestartet. Der Kernel führt Ihre Befehle aus und beeinhaltet alle verwendeten Objekte (Variablen, Funktionen, Pakete etc.). Starten Sie zum Einstieg unter dem Menüeintrag Help die User Interface Tour. 3.2 Beenden Um Ihre Arbeit in einem Notebook zu beenden, 1. speichern Sie zuerst das Notebook mit Strg-S oder dem Save-Icon in der Toolbar und 2. verwenden Sie danach unter File den Befehl Close and Halt. Dadurch werden • der Kernel heruntergefahren und somit alle Variablenwerte gelöscht • der Browser-Tab geschlossen. Achtung: Sollten Sie den Tab des Notebooks ohne Close and Halt geschlossen haben, dann läuft der Kernel weiter, und Sie können im Jupyter-Dashboard das Notebook durch Anklicken wieder in einem Tab öffnen oder im Reiter Running des Jupyter-Dashboards den noch laufenden den Kernel herunterfahren. 5 Um das Jupyter-Dashboard zu beenden, drücken Sie Strg-C zweimal im anfangs geöffneten System-Terminal. 3.3 Zellen Das Notebook besteht aus einer Liste von Zellen (engl. cells). Modi: Zellen können im Command Mode (blau umrandet) oder im Edit Mode (grün umrandet) bearbeitet werden. Bearbeiten: Über die Menüeinträge Edit, Insert, Cell und über die Toolbar können Sie Zellen ausführen, verschieben, zusammenfügen, splitten, löschen etc. Tastenkürzel: Im Menüeintrag Help finden Sie unter Keyboard shortcuts eine Liste von vielen Tastenkürzeln, deren Verwendung Ihre Arbeit sehr beschleunigen können! Die wichtigsten zwei Zelltypen sind Code und Markdown. Sie können den Typ einer Zelle über die Toolbar oder ein Tastenkürzel ändern. Code-Zellen: Hier können Sie • • • • • Variablen definieren Pakete importieren deren Funktionen(=Befehle) aufrufen neue Funktionen definieren weitere Programmierstrukturen verwenden: for-Schleifen, if-Abfragen etc. Code-Kommentare beginnen mit dem Rautezeichen #. Der letzte Befehl einer Code-Zelle wird in einem folgenden Output-Zelle ausgegeben. Sie können die Ausgabe mit einem Strichpunkt am Ende des letzten Befehls unterdrücken. Funktionen haben immer runde Klammern! Hilfe z. B. zur Funktion print erhalten Sie durch • help(print) oder • print? oder • (öfter) SHIFT-Enter drücken, wenn der Cursor nach der ersten runden Klammer steht. Variablen: Eine Liste der von Ihnen definierten Variablen erhalten Sie mit dem magic command %whos. Löschen einzelner Variablen, hier z. B. der Variable x, erfolgt mit dem Befehl del(x). Löschen aller selber definierten Variablen erfolgt mit dem Befehl %reset -s Das Importieren der Numpy und Matplotlib Befehle erfolgt z. B. mit dem magic command %pylab inline. Als optionalen Parameter kann man inline angeben, sodass Abbildungen im Notebook und nicht in einem eigenen Fenster dargestellt werden. Tipp: Tabulator-Vervollständigung verwenden! Markdown-Zellen: Markdown ist eine vereinfachte Auszeichnungssprache, die bereits in der Ausgangsform ohne weitere Konvertierung leicht lesbar ist. Sie können in Markdown sehr leicht folgenden strukturierten Text erstellen: • • • • • Überschirften: Rautesymbol(e) vor der Überschrift Listen: mit Minus- oder Pluszeichen Links: z. B. ETW, Syntax [Name](URL) Bilder: mit Syntax ![Name](Pfad-zu-Bilddatei) 2 Mathematische Formeln via LaTeX, z. B. K = mv 2 Tipp: Cheatsheet 6 3.4 Exportieren Sie könne Notebooks über den Menüeintrag File/Download as oder über Systembefehle in andere Dateiformate exportieren. Systembefehle können Sie auf folgende Weisen ausführen: • in einem System-Terminal • im Anaconda Command Prompt • in einer Codezelle, wenn Sie ein Rufezeichen vor den Systembefehl setzen. HTML: Systembefehl !jupyter-nbconvert Mein_Notebook.ipynb PDF: Zur Konvertierung von Jupyter-Notebook zu pdf müssen eine TeX-Distribution, z. B. TeX Live, und Pandoc installiert sein. Systembefehl: jupyter-nbconvert --to pdf Mein_Notebook.ipynb LaTeX: Systembefehl jupyter-nbconvert --to latex Mein_Notebook.ipynb Python-Script: Systembefehl jupyter-nbconvert --to script Mein_Notebook.ipynb Slides: inkl. Präsentation via Webserver. Bevor Sie den Systembefehl jupyter-nbconvert --to slides --post serve Mein_Notebook.ipynb in einem System-Terminal oder im Anaconda Command Prompt aufrufen, müssen Sie zuerst in der Toolbar unter Cell Toolbar die Option Slideshow einstellen und anschließend Ihre Zellen zu Slides, Sub-Slides, Fragements, Skip oder Notes definieren. Beenden Sie den gestarteten Webserver nach der Präsentation durch Strg-C im Terminal bzw. im Anaconda Command Prompt. Link: nbconvert.readthedocs.io/en/latest/usage.html 3.5 Navigationsbefehle im Dateisystem Für die Arbeit in einem System-Terminal, dem Anaconda Command Prompt oder in einer Codezelle sind oft folgende Navigationsbefehle nützlich: • • • • pwd: print working/current directory ls oder dir: list files in current directory cd DIR: change into absolute or relative directory DIR cd ..: change to parent directory 4 Datentypen In Python stehen Ihnen, wie auch in anderen Programmiersprachen, für unterschiedliche Zwecke entsprechende Datentypen zur Verfügung. Jedes Objekt ist von einem bestimmten (Daten)Typ. 4.1 Überblick über Standardtypen Wir verwenden die englischen Namen der Standardtypen, da Sie diese auch so in der (interaktiven) Hilfe und beim Suchen im Internet finden. • Boolean: die logischen Wahrheitswerte True und False • Numeric Types: Integers (ganze, auch negative Zahlen), Floats (Dezimalzahlen), komplexe Zahlen • Sequences: Lists (Listen von anderen Daten), Tuples (unveränderbare Listen), Strings (Wörter inkl. Leerzeichen, Zeilenumbruch und Sonderzeichen) 7 • • • • Sets: Mengen Dictionaries: Schlüssel-Objekt-Paare wie z. B. {“AT”: 1, “CH”:2, “DE”:3} Functions: Input zu Output Transformationen ... Link: Python standard types documentation 4.2 Boolean Eine Abfrage über größer (gleich), (un)gleich oder kleiner (gleich) liefert als Ergebnis ein Objekt vom Typ Boolean: 3 > 2 # greater True 3 > 3 False 3 >= 3 # greater or equal True 3 == 3.0 # equal True 42 != 42 # not equal False Auch Wörter (Strings, siehe weiter unten) können verglcihen werden: "Emil" == "emil" False Von welchem Typ ein Objejekt ist, können Sie mit der eingebauten Funktion type bestimmen: type(True) bool 4.3 Numeric Types Ganze Zahlen: . . . , -3, -2, -1, 0, 1, 2, 3, . . . sind vom Typ int. n = 12 type(n) int Fließkommazahlen (=Dezimalzahlen) sind von Typ float. x = 12.3 type(x) float Komplexe Zahlen bestehen aus einen Realteil (int oder float) und einem Imaginärteil. Die imaginäre Einheit wird mit j geschrieben und ohne Malzeichen * an den Imaginärteil multipliziert. 8 z = 12.4 + 3.7j type(z) complex Rechenoperationen: x + 2*n 36.3 x - z (-0.09999999999999964-3.7j) 12/5 2.4 vgl. Modulo-Rechnung 12//5 2 Achtung: Potenzieren mit ** und nicht mit ˆ x**2 151.29000000000002 4.4 Sequences • können Daten unterschiedlichen Typs enthalten • haben geordnete Elemente, Indizierung: – – – – mit eckigen Klammern beginnend bei 0 von Index a inklusive bis b exklusive mit a:b der letzte Eintrag hat den Index -1, der vorletzte Eintrag hat den Index -2, . . . Lists: • verwenden eckige Klammern • sind veränderbar numbers = [12, 12.3, 5, -8, 23] numbers [12, 12.3, 5, -8, 23] type(numbers) list len(numbers) # Länge = Anzahl an Elementen 5 numbers[0] # erstes Element 12 9 numbers[-1] # letztes Element 23 # erstes Element neu setzen: numbers[0] = 10 numbers [10, 12.3, 5, -8, 23] Slicing: nicht nur einzelne Elemente, sondern ganze Unterlisten “herausschneiden” numbers[2:4] [5, -8] Achtung: Oben wars das Element mit Index 2 (das dritte Element) inklusive und das Element mit Index 4 (das fünfte Element) exklusive! numbers[1:] # open end [12.3, 5, -8, 23] numbers[:3] # beginning from start [10, 12.3, 5] Anfügen ans Ende der Liste: numbers.append(-3) numbers [10, 12.3, 5, -8, 23, -3] Sortieren: numbers.sort() # aufsteigend sortieren, mit Option reverse=True absteigend numbers [-8, -3, 5, 10, 12.3, 23] Achtung: + und * bewirken Aneinanderkettung numbers + numbers [-8, -3, 5, 10, 12.3, 23, -8, -3, 5, 10, 12.3, 23] 3*numbers [-8, -3, 5, 10, 12.3, 23, -8, -3, 5, 10, 12.3, 23, -8, -3, 5, 10, 12.3, 23] Sie können überprüfen, ob ein Objekt in einer Liste vorkommt. 7 in [2, 3, 4, 5, 6, 7, 8, 9, 7] # incuded in True Tipp: list comprehension [x**2 for x in numbers if x > 0] [25, 100, 151.29000000000002, 529] Tuples: • verwenden runde Klammern 10 • sind nicht veränderbar t = (3, 2, 5) type(t) tuple # results in TypeError: 'tuple' object does not support item assignment # t[1] = 10 Strings: Wörter, Buchstaben und Wortketten, inkl. Sonderzeichen • einfache oder doppelte Anführungszeichen, dieselben zu Beginn und am Ende • veränderbar • Zeilenumbruch mit \n s1 = 'Hello \n' s2 = "World!" s1 + s2 'Hello \nWorld!' print(s1 + s2) Hello World! Formatierte Ausgabe: n = 12 print("Die Wurzel aus {:d} ist circa {:8.5f}".format(n, n**0.5)) # Variante: print("Die Wurzel aus %d ist circa %8.5f" %(n, n**0.5)) Die Wurzel aus 12 ist circa Die Wurzel aus 12 ist circa 3.46410 3.46410 5 Matrizenrechnung Um mit Vektoren und Matrizen nach den Regeln der Mathemaik zu arbeiten, gibt es das Paket NumPy. das den Datentyp numpy.ndarray, kurz array, bereitstellt: • Die Indizierung erfolgt analog zu Sequences • Import: Wir imporieren die NumPy-Funktionen in den Haupt-Namespace mit %pylab inline. Oft wird NumPy auch als Namespace np durch import numpy as np importiert, um den Haupt-Namespace nicht zu überladen. %pylab inline %config InlineBackend.figure_format = 'svg' import seaborn as sns Populating the interactive namespace from numpy and matplotlib 11 5.1 Vektoralgebra: 1-dimensionale arrays • nur eine Klammerung, z. B. beim Inputs der array-Funktion und bei der Indizierung • Achtung: keine Unterscheidung in Spalten- oder Zeilenvektoren! v = array([3, 2.1, -5]) v array([ 3. , 2.1, -5. ]) type(v) numpy.ndarray # Vektoren sind 1-dimensional ndim(v) 1 Die Anzahl der Elemente wird als Länge (engl. length) bezeichnet. Achtung, das ist nicht die geometrische Länge des Vektors! len(v) 3 Viele Funktionen lassen sich alternativ als Methoden der Objekte mit Punkt-Notation aufrufen: print(v.dtype) # data type: Type der Einträge print(v.ndim) print(v.mean()) float64 1 0.0333333333333 Rechnoperationen: Achtung! +, -, *, ** und / sind nun elementweise Operationen. 3*v # Skalarmultiplikation array([ 9. , 6.3, -15. ]) v + v # Vektoraddition array([ 6. , 4.2, -10. ]) Das innere Produkt wird im Englischen oft “dot product” genannt. dot(v, v) 38.409999999999997 # alternativ mit dem @ Operator: v@v 38.409999999999997 cross(v, v) # Kreuzprodukt array([ 0., 0., 0.]) v*v # Achtung elementweise! array([ 9. , 4.41, 25. ]) 12 v/v # elementweise! array([ 1., 1., 1.]) v**3 # elementweise! array([ 27. , 9.261, -125. ]) 5.2 Matrixalgebra: 2-dimensionale arrays Zwei Dimensionen und daher auch zwei Klammeren: • erste Dimension: wievielte Zeile = Zeilenindex • zweite Dimension: wievielte Spalte = Spaltenindex A = array([[1, 2, sqrt(4)], [4, -3, pi]]) A array([[ 1. [ 4. , 2. , -3. , , 2. ], 3.14159265]]) A.shape # 2x3 Matrix (2, 3) dot(A, v) # Matrix-Vektor-Produkt array([ -2.8 , -10.00796327]) # alternativ mit dem @ Operator: A@v array([ -2.8 , -10.00796327]) dot(v[:2], A) # Vektor-Matrix-Produkt array([ 11.4 , -0.3 , 12.59734457]) , 12.59734457]) # alternativ mit dem @ Operator: v[:2]@A array([ 11.4 , -0.3 w = array([[1, 2, 3]]) w.shape (1, 3) # dot(A, w) gibt einen Fehler. Warum? w.T # Transponieren array([[1], [2], [3]]) w.T.shape (3, 1) dot(A, w.T) # oder [email protected] 13 array([[ 11. ], [ 7.42477796]]) Slicing: A[:,0] # Ergebnis: 1-dim array array([ 1., 4.]) A[:,[0]] # Ergebnis: 2-dim array array([[ 1.], [ 4.]]) A = array([[3, -2], [0, 12]]) b = array([1, 2]) # Lösen des quadratischen Gleichungssystems Ax=b x = solve(A, b) x # Ergebnis: 1-dim array, wie b array([ 0.44444444, 0.16666667]) c = b.reshape(2,1) c # 2-dim array array([[1], [2]]) Lösen eines Gleichungssystems: x = solve(A, c) x # Ergebnis: 2-dim array, wie c array([[ 0.44444444], [ 0.16666667]]) flattening of a 2-dim array into a 1-dim array: A.ravel() array([ 3, -2, 0, 12]) # vergleiche: A array([[ 3, -2], [ 0, 12]]) Aufgabe: Welche Funktionalitäten bieten folgende Befehle? • • • • • • • linspace arange eye ones zeros diag vstack 14 • • • • hstack column_stack row_stack reshape Experimentieren Sie mit den Befehlen! 6 Grafiken 6.1 Passive Grafiken: matplotlib Wir werden nur zwei Beispiele in diesem Abschnitt aufzeigen. Die fast unüberschaubare Vielfalt an grafischen Darstellungsmöglichkeiten mit dem Python-Paket Matplotlib finden Sie z. B. unter Matplotlib Gallery # Importieren der der Numpy und Matplotlib Befehle: %pylab inline Populating the interactive namespace from numpy and matplotlib # Bilder werden im SVG-Format erstellt: %config InlineBackend.figure_format = 'svg' # Durch den Import des seaborn Paketes wird die Default-Darstellung von Abbildungen geändert import seaborn as sns Beispiel 1: 2D-Plot Wir plotten einen Vektor x gegen einen Vektor y: x = linspace(-1, 3, num = 11) x array([-1. , -0.6, -0.2, 0.2, 0.6, 1. , 1.4, 1.8, 2.2, 2.6, 3. ]) # Typ des Objekts x: type(x) numpy.ndarray %whos Variable Type Data/Info ------------------------------sns module <module 'seaborn' from '/<...>ges/seaborn/__init__.py'> x ndarray 11: 11 elems, type `float64`, 88 bytes y = -x**2 + 8 figure(figsize=(5,3)) plot(x, y, 'o-r', label='Parabel') xlabel('Weite') ylabel('Höhe') ylim(-2, 10) title('Wurfparabel') legend(numpoints=1, loc='best') grid(True) 15 savefig('abbildungen/Wurfparabel.pdf') Beispiel 2: Sankey-Diagramm Nach dem Import der Sankey Funktion erstellen wir ein Sankey-Diagramm. from matplotlib.sankey import Sankey fig = figure(figsize=(6,4)) ax = fig.add_subplot(1,1,1) axis('off') Sankey(flows=[0.25, 0.15, 0.60, -0.20, -0.15, -0.05, -0.50, -0.10], ax = ax, labels=['', '', '', 'First', 'Second', 'Third', 'Fourth', 'Fifth'], orientations=[-1, 1, 0, 1, 1, 1, 0, -1]).finish(); savefig('abbildungen/Sankey.pdf') 16 6.2 Interaktive Grafiken: ipywidgets Link: ipywidgets.readthedocs.io/en/stable/ from ipywidgets import interact x = linspace(-2, 2, num= 100) def my_f(k): y = k*x plot(x, y) ylim((-2, 2)) xlim((-2, 2)) grid(True) show() interact(my_f, k=(-1, 1, 0.1)); 7 Funktionen 7.1 Syntax def my_function(x, y, a = 1): """" Hilfetext """ " z = 3*x + 5*sin(y) + a return z 7.2 Beispiel 1: Hello . . . ! def my_hello(what): """ returns the string "Hello" concatenated with the input string """ text = "Hello, " + what + "!" return text my_hello("world") 'Hello, world!' 7.3 Beispiel 2: Fahrzeug auf ebener Fahrbahn Wir verwenden mit dem Befehl linspace die Datenstruktur array, um die Strömungswiderstandskraft für unterschiedliche Geschwindigkeiten zu berechnen. Auf nicht ebener Strecke kommt die Gravitationskraft noch dazu. Links: • Strömungswiderstandkraft • Rollwiderstandskraft 17 %pylab inline Populating the interactive namespace from numpy and matplotlib Paramterwerte: # Massse in kg m = 110 # Erdbeschleunigung in m/s^2 g = 9.81 # Rollwiderstandsbeiwert cr = 0.0055 # Strömungswiderstandskoeffizient cw = 0.076 # Bezugsfläche in m^2 A = 0.41 # verschiedene Anströmgeschwindigkeiten in m/s v = linspace(0, 20, num=20) Strömungswiderstandkraft: def F_Stroemung(cw, A, v, rho = 1.2041): """ Strömungswiderstandskraft in Abhängigkeit von - Strömungswiderstandskoeffizient: cw Bezugsfläche: A in m^2 Anströmgeschwindigkeit: v in m/s Dichte: rho in kg/m^3, Default= 1.2041 (Luft) ist gegeben durch F = cw*A*1/2*rho*v**2 """ F = cw*A*0.5*rho*v**2 return F F_S = F_Stroemung(cw, A, v, rho = 1.2) F_S array([ 0. , 0.51789474, 2.07157895, 4.66105263, 0.02071579, 0.74576842, 2.50661053, 5.30324211, 0.08286316, 1.01507368, 2.98307368, 5.98686316, Rollwiderstandskraft: F_R = cr*m*g F_R 18 0.18644211, 1.32581053, 3.50096842, 6.71191579, 0.33145263, 1.67797895, 4.06029474, 7.4784 ]) 5.93505 figure(figsize=(5,3)) plot(v, F_S, 'b', label='Strömung') hlines(F_R, min(v), max(v), color= 'r', label='Roll') xlabel('Geschwindigkeit [m/s]') ylabel('Strömungswiderstandskraft [N]') legend(loc='best') grid(True) 8 Kontrollstrukturen Die wichtigsten Typen von Kontrollstrukturen sind: • if else Abfrage • for Schleife • while Schleife %pylab inline %config InlineBackend.figure_format = 'svg' import seaborn as sns Populating the interactive namespace from numpy and matplotlib 8.1 if else Abfrage Beispiel: Determinante und inverse Matrix Falls eine Matrix eine Determinante nicht Null hat, ist sie invertierbar. A = array([[1, 2], [3, 4]]) print(A) [[1 2] [3 4]] 19 if det(A) != 0: B = 1/det(A)*array([ [ A[1,1], -A[0,1] ], [-A[1,0], A[0,0] ] ]) print(B) print(inv(A)) else: print("Matrix ist nicht invertierbar.") [[-2. 1. ] [ 1.5 -0.5]] [[-2. 1. ] [ 1.5 -0.5]] # Probe: dot(A, B) # oder A@B array([[ 1., [ 0., 0.], 1.]]) 8.2 for Schleife Beispiel: Arrhenius-Gleichung Die Arrhenius-Gleichung, benannt nach Svante Arrhenius, beschreibt näherungsweise eine quantitative Temperaturabhängigkeit bei physikalischen und vor allem chemischen Prozessen, bei denen auf molekularer Ebene eine Aktivierungsenergie überwunden werden muss. Die ArrheniusGleichung ist eine phänomenologische Beziehung und gilt für sehr viele chemische Reaktionen. Unter anderem wird auch das Alterungsverhalten von Lithium-Ionen-Akkumulatoren damit beschreibbar. Die Arrhenius-Gleichung beschreibt in der chemischen Kinetik für den Spezialfall monomolekularer Reaktionen die quantitative Abhängigkeit der Reaktionsgeschwindigkeitskonstanten k von der Temperatur: −EA k = Ae RT mit • • • • A . . . präexponentieller oder Frequenzfaktor EA . . . Aktivierungsenergie (Einheit: J mol−1 ) R . . . universelle Gaskonstante (8,314 J K−1 mol−1 ) T . . . absolute (thermodynamische) Temperatur (Einheit: K) Quelle: https://de.wikipedia.org/wiki/Arrhenius-Gleichung A = 1 EA_values = arange(10, 200, 50) R = 8.314 T = linspace(1, 500, num = 100) figure(figsize=(6,4)) for EA in EA_values: k = A*exp(-EA/(R*T)) plot(T, k, label="EA = {:d} J/mol".format(EA), linewidth=2) legend(loc='best') xlabel('T') 20 ylabel('k') grid(True) 8.3 while Schleife Beispiel: Collatz-Problem Das Collatz-Problem, auch als (3n+1)-Vermutung bezeichnet, ist ein ungelöstes mathematisches Problem, das 1937 von Lothar Collatz gestellt wurde. Bei dem Problem geht es um Zahlenfolgen, die nach einem einfachen Bildungsgesetz konstruiert werden: • • • • Beginne mit irgendeiner natürlichen Zahl n > 0. Ist n gerade, so nimm als Nächstes n/2, Ist n ungerade, so nimm als Nächstes 3n + 1. Wiederhole die Vorgehensweise mit der erhaltenen Zahl. So erhält man zum Beispiel für die Startzahl n = 19 die Folge 19, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1, . . . Anscheinend mündet jede Folge mit n > 0 in den Zyklus 4, 2, 1, unabhängig davon, welche Startzahl n man probiert hat. Die Collatz-Vermutung lautet: Jede so konstruierte Zahlenfolge mündet in den Zyklus 4, 2, 1, egal, mit welcher natürlichen Zahl n > 0 man beginnt. Trotz zahlreicher Anstrengungen gehört diese Vermutung noch immer zu den ungelösten Problemen der Mathematik. Mehrfach wurden Preise für eine Lösung ausgelobt. Quelle: https://de.wikipedia.org/wiki/Collatz-Problem n = 70 while True: if n % 2 == 0: n = n/2 else: n = 3 * n + 1 # Der Modulo Operator % liefert den Rest der Division. 21 print(n) if n == 1: break 35.0 106.0 53.0 160.0 80.0 40.0 20.0 10.0 5.0 16.0 8.0 4.0 2.0 1.0 9 Daten-IO Daten laden und speichern 9.1 NumPy Befehle Link: docs.scipy.org/doc/numpy/reference/routines.io.html %pylab inline Populating the interactive namespace from numpy and matplotlib Daten aus Textdatei einlesen: A = genfromtxt('daten/AustriaW-o.csv', delimiter=",", skip_header=1) A array([[ 47.235154 [ 47.23515 [ 47.23451 ..., [ 47.94042 [ 47.94034 [ 47.94011 , , , , , , 9.59921836, 9.59921 , 9.59925 , 17.06803 17.06798 17.06859 , , , 467. 466. 465. ], ], ], 142. 142. 140. ], ], ]]) elevation = A[:,2] figure(figsize=(8,3)) plot(elevation) xlabel('Datenpunkt') ylabel('elevation') grid(True) 22 Matrix von Zufallszahlen: B = randn(10, 3) B array([[ 0.69647387, [ 0.5511336 , [-0.18151827, [-0.04850343, [ 0.89181773, [-0.34304204, [-0.40687218, [ 0.91194416, [-0.58071868, [ 0.58517214, 0.92849206, 0.89693122, -0.98037619, 0.14501138, -0.07503731, 0.61168174, -0.37346573, -0.4345603 , -0.75033516, -1.28535455, 0.04061399], -1.18229411], -0.47596028], 0.88081873], 0.93466913], -0.74506326], -0.21545588], 0.14213569], 1.25259673], -0.39639893]]) Speichern als CSV-Datei: savetxt('daten/Zufallszahlenmatrix.csv', B, delimiter=',') 9.2 Pickle Speichern und Laden von Objekten jeglichen Datentyps. Siehe z. B. wiki.python.org/moin/UsingPickle import pickle my_object = ['Ich', 'und', 7] pickle.dump( my_object, open( "daten/save.p", "wb" ) ) del my_object %whos Variable Type Data/Info -------------------------------A ndarray 9398x3: 28194 elems, type `float64`, 225552 bytes (220.265625 kb) B ndarray 10x3: 30 elems, type `float64`, 240 bytes elevation ndarray 9398: 9398 elems, type `float64`, 75184 bytes my_object list n=3 pickle module <module 'pickle' from '/u<...>lib/python3.6/pickle.py'> 23 my_object = pickle.load( open( "daten/save.p", "rb" ) ) my_object ['Ich', 'und', 7] 10 Literatur und Links 10.1 Leitfaden Einführungen und Grundlagen: • IPython Notebook Essentials (Martins 2014) • IPython Interactive Computing and Visualization Cookbook (Rossant 2014) • Introduction to Computation and Programming Using Python (Guttag 2013) Fortgeschrittene Bücher und Vertiefungen: • Numerical Python - A Practical Techniques Approach for Industry (Johansson 2015) • Python for Data Analysis (McKinney 2012), PDF-Download im FHV-Campusnetz, deutsche Übersetzung: Datenanalyse mit Python (McKinney 2015) • Introduction to Machine Learning with Python: A Guide for Data Scientists (Müller; Guido 2016) 10.2 Literaturverzeichnis Guttag, John V. (2013): Introduction to Computation and Programming Using Python. Revised and Exp. Mit Pr, S. 296. Johansson, Robert (2015): Numerical Python: A Practical Techniques Approach for Industry. 1st ed. Apress, S. 512. Martins, L. Felipe (2014): IPython Notebook Essentials. Packt Publishing, S. 190. McKinney, Wes (2015): Datenanalyse Mit Python: Auswertung von Daten Mit Pandas, NumPy Und IPython. 1., Auflage. O’Reilly, S. 478. McKinney, Wes (2012): Python for Data Analysis. 1. Aufl. O’Reilly Media, S. 452. Müller, Andreas; Guido, Sarah (2016): Introduction to Machine Learning with Python: A Guide for Data Scientists. 1. Aufl. O’Reilly UK Ltd., S. 400. Rossant, Cyrille (2014): IPython Interactive Computing and Visualization Cookbook. Packt Publishing, S. 512. 24