RoVi - Einführung in Python Matthias Ochs Visual Sensorics and Information Processing Lab Goethe-University, Frankfurt 14. April 2016 Matthias Ochs 1 Übungsbetrieb Übungsblätter werden freitags auf der Vorlesungswebsite zum Download bereitgestellt Alle Dokumente sind mit einem Passwort geschützt Passwort: rovi2016 Abgabe der Übungsblätter ist freiwillig Lösungen können per Mail ([email protected]) an uns geschickt werden Elegante Lösungsvorschläge können in der nächsten Übung vorgestellt werden Matthias Ochs 2 Python Schnell zu erlernende Programmiersprache → ”tut, was man erwartet” Open-Source Software Plattformunabhängig Python ist eine Skriptsprache → interpretiert und nicht kompiliert Objektorientierte Programmierung ist möglich Viele Standardfunktionen Breite Auswahl an zusätzlichen Biblotheken Matthias Ochs 3 Informationen zu Python Aktuelle Versionen 3.5.2 und 2.7.12 Wichtige Biblotheken für ME: NumPy, SciPy, Matplotlib und OpenCV Komplett Paket für einfache Installation: Anaconda (https://www.continuum.io/) Matthias Ochs 4 Python Shell > python >>> print "Hello World" Hello World >>> help("print") >>> exit() >>>: markiert Eingaben print: Ausgabe auf der Konsole help: Interaktive Hilfe, wird mit ”q” beendet exit: Beendet Python (Shortcut: strg+d) Matthias Ochs 5 Python Skripte HelloWorld.py # Erstes Beispielprogramm print "Hello World python HelloWorld.py: Startet das Skript #: Kommentar ’’’ code ’’’: Kommentarblock Matthias Ochs 6 Datentypen Ganze Zahlen: >>> print 10 10 >>> print -12 Fließkommazahlen: >>> print 10.0 10.0 >>> print 1.2e3 1200 >>> print 4.5e-2 0.045 1.2e3 steht für 1.2 · 103 Matthias Ochs 7 Datentypen Zeichenketten (Strings): >>> print "Hello World" Hello World >>> print ’Hello World’ Hello World Kein Unterschied zwischen einfachen (’) und doppelten (”) Anführungszeichen Zeichenketten sind keine Zahlen! ”1” 6= 1 Matthias Ochs 8 Variablen >>> >>> >>> 1 6 >>> >>> ME x = 1 y = x+5 print x, y y = "ME" print y Variablennamen besteht aus Buchstaben, Ziffern oder Unterstrichen Am Anfang keine Ziffern Groß- und Kleinschreibung ist relevant: X 6= x Richtig: i, some val, someValue, v123, hidden 1 Falsch: 1 val, some val, some-val Matthias Ochs 9 Arithmetische Ausdrücke +: Addition, bei Strings zusammenfügen, z.B.: 1 + 2 → 3, ”a” + ”b” → ”ab” -: Subtraktion, z.B.: 1 − 2 → −1 *: Multiplikation, Strings verviefältigen, z.B.: 2 ∗ 2 → 4, ”ab” *2 → ”abab” /: Division, bei ganzen Zahlen ganzzahlig, z.B.: 3/2 → 1, −3/2 → −2, 3.0/2 → 1.5 **: Exponent, z.B.: 3**2 → 9 Matthias Ochs 10 Logische Ausdrücke ==: Gleichheit, z.B.: 1 == 1.0 → True , 2 == 3 →False !=: Ungleichheit, z.B.: 1 != 1.0 → False , 2 != 3 → True <, >, <=, >=: Vergleiche, z.B.: 2 >1 → True , 1 <= 1 → True or, and: Logische Verknüpfungen ”oder” bzw. ”und” not: Logische Verneinung Liefern Wahrheitswerte: True oder False Matthias Ochs 11 if: Bedingte Ausführung >>> x = 1 >>> if x < 5: ... print "x ist kleiner 5" ... elif x > 5: ... print "x ist groesser 5" ... else: ... print "x ist 5" x ist kleiner 5 >>> if x < 5 and x > 5: ... print "das geht nicht" if-elif-else führt den Block nach der ersten erfüllten Bedingung aus Trifft keine Bedingung zu, dann wird der else-Zweig ausgeführt elif und else sind optional Matthias Ochs 12 Blöcke und Einrückungen >>> x = 1 >>> if x < 5: ... # wenn x kleiner 5 ... b = False ... else: b = True ... print b False Alle gleich eingerückten Befehle gehören zum Block Nach dem if-Befehl geht auf Einrückungsebene des if weiter, egal welcher if-Block ausgeführt wurde Einzeilige Blöcke können auch direkt hinter dem Doppelpunkt stehen Einrücken durch Leerzeichen (Achtung: immer gleiche Anzahl!) oder Tabulatoren Matthias Ochs 13 Blöcke und Einrückungen Ein Block kann nicht leer sein, aber der Befehl pass tut nichts: >>> if x < 5: ... pass ... else: ... print "x ist groesser gleich 5" IndentationError bei falsche Einrückung: >>> print "hallo" hallo >>> print "hallo" File "<stdin>", line 1 print "hallo" ^ IndentationError: unexpected indent Falsche Einrückung führt im Allgemeinen zu Programmfehlern! Matthias Ochs 14 while: Schleifen Ein Block kann nicht leer sein, aber der Befehl pass tut nichts: >>> x = 1 >>> while x < 5: ... x = x+1 >>> print x 5 Führt den Block solange aus, wie die Bedingung wahr ist >>> x = 6 >>> while x < 5: ... x = x+1 >>> print x 6 Matthias Ochs 15 for: Schleifen >>> 1 2 >>> >>> ... >>> for i in range(1,3): print i b = 0 for i in range(100): b = b+i print 4950 for führt einen Block für jedes Element einer Sequenz aus Das aktuelle Element steht in i range(a,b) ist eine Liste der Zahlen i mit a ≤ i ≤ b Kann auch für eine Liste von Werten verwendet werden: for i in [2,4,6,8]: Matthias Ochs 16 Funktionen >>> def printPi(): ... print "pi ist 3.1415" >>> printPi() pi ist 3.1415 Eine Funktion kann beliebig viele Argumente haben Argumente sind Variablen der Funktion Der Funktionskörper ist wieder ein Block Matthias Ochs 17 Funktionen >>> def printMax(a,b) ... if a > b: ... print a ... return a ... else: ... print b ... return b >>> printMax(3,2) 3 Eine Funktion kann einen Wert zurückliefern Der Wert wird im return Statement spezifiziert Matthias Ochs 18 Komplexe Datentypen Komplexe Datentypen sind zusammengesetzte Datentypen Beispiel: Eine Zeichenkette besteht aus beliebig vielen Zeichen Wichtige komplexe Datentypen: Strings Listen Tupel Dictionaries (Wörterbücher) Matthias Ochs 19 Komplexe Datentypen >>> einkaufsListe = ["cola", "milch", "obst"] >>> einkaufsListe[1] = "sahne" >>> print einkaufsListe [’cola’, ’sahne’, ’obst’] >>> print einkaufsListe[-1] obst >>> einkaufsListe.append("nutella") >>> print einkaufsListe[-1] nutella >>> del einkaufsListe[-1] print einkaufsListe [’cola’, ’sahne’, ’obst’] Matthias Ochs 20 Module >>> import random >>> print random.random(), random.randint(0, 100) 0.3452345345, 25 >>> from random import randint >>> print randint(0, 100) 91 Module können per import zugänglich gemacht werden Einzelne Bestandteile kann man mit from ... importieren import ... Abkürzung: import numpy as np Matthias Ochs 21 Numerik mit Python - Numpy Numpy ist ein Modul für effiziente numerische Rechnungen Baut auf n-dimensionalen Feld-Datentyp numpy.array auf: Feste Größe und Form Alle Elemente vom selben Datentyp Viele Berechnungen und Transformationen möglich Bietet: Mathematischen Operationen Sortieren, Auswahl von Spalten, Zeilen usw. Eigenwerte, -vektoren, SVD, Diagonalisierung Fouriertransformation Statistische Auswertung: Mittelwert, Varianz, Kovarianzmatrizen Zufallsgeneratoren Weitere Infos: http://docs.scipy.org Matthias Ochs 22 np.array - 1D Arrays >>> import numpy as np >>> np.array([1, 2, 3]) array([1,2,3]) >>> np.ones(5) array([1.,1.,1.,1.,1.]) >>> np.arange(2,3,0.2) array([2.0, 2.2, 2.4, 2.6, 2.8]) >>> np.linspace(0,1,4) array([0.0, 0.25, 0.5, 0.75, 1]) np.array: Erzeugt ein Numpy Array np.zeros/ones: Erzeugt ein Numpy Array mit 0er/1er np.arange: Entspricht range für Numpy Arrays np.linspace: Generiert Zahlen mit gleichmäßigen Abstand Matthias Ochs 23 np.array - Mehrdimensionale Arrays >>> import numpy as np >>> np.array([[1, 2, 3],[4, 5, 6]]) array([[1, 2, 3], [4, 5, 6]]) >>> np.zeros((2,4)) array([[0, 0, 0, 0], [0, 0, 0, 0]) >>> np.eye(3) array([[1, 0, 0], [0, 1, 0], [0, 0, 1]]) Mehrdimensionale Arrays entsprechen verschachtelten Listen Alle Zeilen müssen dieselbe Länge haben np.zeroes/ones: Größe als Tupel von Dimensionen Matthias Ochs 24 np.array - Elementzugriff >>> import numpy as np >>> a = np.array([[0, 1, 2, 3, 4],[5, 6, 7, 8, 9]]) >>> print a.shape, a[1,2], a[0,:], a[:,3] (2,5) 7 array([0,1,2,3,4]) array([3, 8]) >>> print a[1,0::2] array([5,7,9]) indiziert Elemente und Zeilen Auch Bereich wie bei Listen .shape: Gibt die Größe des Arrays zurück Matthias Ochs 25 Matrixoperationen >>> import numpy as np >>> a = np.array([[1, 2],[3, 4]]) >>> b = np.concatenate((a, [[5,6]]), axis = 0) [[1, 2], [3, 4], [5, 6]] >>> print b.transpose() [[1,3,5], [2,4,6]] >>> print b[1].reshape((2,1)) [[3], [4]] concatenate: Verbindet zwei Arrays transpose: Transponiert ein Array reshape: Ändert die Form des Arrays min(), max(): Berechnet Min, Max alle Elemente Matthias Ochs 26 Lineare Algebra >>> import numpy as np >>> a = np.array([[1, 2],[3, 4]]) >>> i = np.eye(2) >>> print a*i [[1 0] [0 4]] >>> print a.dot(i) [[1 2] [3 4]] >>> print np.linalg.inv(a) [[-2 1], [1.5 -0.5]] >>> print np.lingalg.det(a) -2.0 Array werden mit Stern-Operator punktweise multipliziert Numpy bietet viele Funktionen zur Matrixmanipulation Matthias Ochs 27 Visualisieren mit Python - Matplotlib >>> import matplotlib.pyplot as plt ... x = np.arange(0, 2*np.pi, 0.01) y = np.sin(x) plt.figure() plt.plot(x,y,"r") plt.show() Mit Matplotlib lassen sich Ergebnisse visualisieren Funktionalität ähnlich zu Matlab Viele Möglichkeiten Plots anzupassen Weitere Infos: http://matplotlib.org/ Matthias Ochs 28 Python mit OpenCV OpenCV: Open Source Computer Vision Library Enthält viele Algorithmen für Computer Vision Aktuelle Version: 3.1 Libary ist in C++ geschrieben, es existieren jedoch Python-Bindings Im Internet gibt es viele Beschreibungen für die Installation Weitere Infos: http://opencv.org Matthias Ochs 29 Thank you Matthias Ochs [email protected] http://www.vsi.cs.uni-frankfurt.de Matthias Ochs 30