• Noser.com
facebook
linkedin
twitter
youtube
  • NOSERmobile
    • Android
    • HTML 5
    • Hybrid Apps
    • iOS
    • Windows Phone
  • NOSERembedded
    • Medizintechnik
  • NOSERprojektmanagement
  • NOSERtesting
  • NOSERlifecycle
    • .NET Allgemein
    • Application Lifecylce Management
    • Apps
    • Architektur
    • ASP.NET
    • Azure
    • Cleancode
    • Cloud
    • Silverlight
    • Visual Studio / Team Foundation Server
    • Windows 8
    • Windows Presentation Foundation
  • NOSERinnovation
    • Big Data
    • Cloud
    • IoT
    • Operations Research
    • Augmented Reality
    • RFID, NFC, Bluetooth LE

Python statt MATLAB – Der Einstieg

01. Mai 2019
Nicola Ochsenbein
0
Anaconda, Einstieg, Matlab, matplotlib, numpy, pyplot, Python, Spyder
Python statt Matlab, plt.plot(x,y) statt plot(x,y)

Im Elektrotechnik Studium erstellten wir viele Grafiken und Berechnungen mit MATLAB. Während dem Studium habe ich mir eine Studentenlizenz gekauft, um den «Luxus» von MATLAB jederzeit zu nutzen. Sobald ich jedoch etwas für einen Kunden evaluieren will, darf ich diese Lizenz nicht mehr benutzen. Steht keine MATLAB-Lizenz zur Verfügung, bedeutet das, dass man eine Alternative braucht.

Alternativen zu MATLAB

Octave

Natürlich kenne ich die freie alternative Octave. Octave ist zu einem Grossteil kompatibel zu MATLAB und der Einstieg daher einfach. Erfahrungen mit Octave habe ich bisher wenig gemacht. Ich hatte einmal eine Simulation aus Neugierde in Octave implementiert und festgestellt, dass die Berechnung wesentlich länger dauerte als mit MATLAB. Diese Erkenntnis aufgrund meines Tests zu generalisieren, wage ich mich jedoch nicht.

Python

Python war in meinem Studiumalltag nicht präsent. Eingesetzt hatte ich es nur 2-3 mal um .csv Files nach vorgegebenen Mustern zu editieren und schätzte die umfangreichen Möglichkeiten einen Task zu lösen.

Der Entscheid für einen Ersatz

Idealerweise kennt man alle drei Tools sehr gut und kann sich vor Beginn für die effizienteste und die kostengünstigste Variante entscheiden. Da MATLAB wegen der hohen Lizenzkosten nicht als erstes in Frage kommt, bleiben noch Octave und Python. Da ich von Python nur sehr wenig kenne, versuche ich den Einstieg hier zusammenzufassen und die ersten Erkenntnisse zu ziehen. So kann ich mich später fundierter für eine Variante entscheiden.

Installation von Python unter Windows 10

Die Installation kann man ziemlich klein halten, wenn man Python direkt installiert und die zusätzlich benötigten Pakete mit “pip” hinzufügt. Der Versuch die Spyder IDE mit “pip” auf meinen beiden Rechnern zu installieren scheiterte auf einem. Den Unterschied in der Installation konnte ich nicht ausfindig machen. Auf der offiziellen Spyder Homepage wird auf die Anaconda Distribution als empfohlene Installationsvariante verwiesen. Anaconda installiert die für den Anfang benötigten Pakete, sowie die Spyder IDE. Es ist also empfehlenswert mit Anaconda (Version Python 3.7) zu beginnen.

Die ersten Plots mit Python

Spyder lässt sich nun entweder via den Anaconda Navigator oder direkt unter Windows→Spyder starten. Unter Ansicht→Fensterlayouts→Matlab Layout kann das Layout so angepasst werden, dass es für MATLAB Nutzer vertrauter aussieht. Plots werden standardmässig im Konsolenfenster angezeigt, da Spyder im Hintergrund IPython nutzt. Will man die Plots wie in MATLAB in einem neuen Fenster, kann man unter Werkzeuge→Voreinstellungen→IPython-Konsole im Tab Grafik das Grafik-Backend von Inline auf Automatisch stellen. Damit die Änderung übernommen wird, muss der Kernel neu gestartet werden: Konsolen→Kernel neu starten.

Ansicht der Spyder IDE mit dem Matlab Fensterlayout

Ansicht der Spyder IDE im MATLAB Fensterlayout

 

Beispiel Gauss Simple

Das nachfolgende Skript generiert eine Gausskurve im Bereich [-4, 4] und zeigt so bereits einige Unterschiede zu MATLAB. Als erstes fällt auf, dass in Python, je nach verwendeten Funktionen, die entsprechenden Pakete importiert werden müssen. Für dieses Beispiel sind es die Funktionen figure, plot und weitere aus matplotlib.pyplot sowie die Funktionen  linspace, sqrt und exp aus numpy. Um die Schreibarbeit klein zu halten und trotzdem mögliche Namenskonflikte mit verschiedenen Paketen zu vermeiden, importieren wir hier die Funktion, respektive die Funktionssammlung aus dem Submodule pyplot, von matplotlib.pyplot als plt und alles aus numpy als np. Diese Kürzel sind praktisch Standards, da sie bereits in den Beispielen der Pakete so verwendet werden.

# Import required packages
import matplotlib.pyplot as plt
import numpy as np

# Gaussian curve constants
mu = 0
sig = 1

# X- and y-axes to be plotted
x = np.linspace(-4,4,81) # X-axis: Create 81 Points in the range [-4, 4]
# Y-axis: Evaluate desired function over the x-range
fx = 1/(np.sqrt(2*np.pi*sig**2)) * np.exp(-1/2 * ((x-mu)/sig)**2)

fig = plt.figure(1) # Set up new figure 1 and save the figure handle
plt.clf() # Clear the current figure

plt.plot(x,fx, label='Normal distribution') # or ax.plot(x,fx) to plot on specific axis

plt.legend() # Display legend
plt.xlabel('Deviation') # Label current x-axis
plt.ylabel('Probability') # Label current y-axis
plt.title('Plot Demo') # Set current axis title

# Show plot
plt.show()

Figure Fenster eines einfachen Plots mit Python

Figure Fenster des Beispiels Gauss Simple

 

Beispiel Gauss Extended

Im 2. Beispiel werden einige Kurven mehr gezeichnet, Subplots verwendet und Achsen im LaTeX Format angeschrieben.

# Import required packages
import matplotlib.pyplot as plt
import numpy as np

# Define a function
def gauss(mu, sig, x):
    # Probability density function of the normal distribution  
    # mu equals the mean
    # sig equals the standard deviation
    # x equals the point being evaluated
    return ( 1 / (np.sqrt(2*np.pi*sig**2)) * np.exp(-1/2 * ((x-mu)/sig)**2))

# Gaussian curve parameters to be evaluated
# mu    = 0.0,  2.5,  2.0,  -0.7
# sig   = 1.0,  3.0,  0.5,   0.8
simParamPairs = [[0,1], [2.5,3], [2,0.5],[-0.7,0.8]]

xmin = -4       # Minimum of x-axis
xmax = 4        # Maximum of x-axis
nrPoints = 81   # Number of points to be evaluated along x-axis

x = np.linspace(xmin,xmax,nrPoints) # Create x-axis array
dxArea = (xmax-xmin)/(nrPoints-1)   # Calculate space between x-points

# Create new figure 1, clear if it already exists and save figure handle
fig = plt.figure(num=2, clear=True) 
plt.suptitle('Normal Distribution for Plot Demonstration', fontsize=16) # Set main title

# Create 2 Subplots in 2 rows and 1 column and save axis handles
ax1 = plt.subplot(2,1,1) # 2 rows, 1 column, figure 1
ax2 = plt.subplot(2,1,2, sharex=ax1) # 2 rows, 1 column, figure 2, Link x-axis

labels = [] # Create empty label array

# Iterate over all parameter pairs
for simParamPair in simParamPairs:
    fx = gauss(simParamPair[0],simParamPair[1],x) # Evaluate each parameter pair
    ax1.plot(x,fx) # Plot fx along x
    # Plot the cumulative sum of fx. To respect the area multiply by the distance
    # between two points. Note that this is not accurate, just for demonstration
    ax2.plot(x,np.cumsum(fx)*dxArea)
    # Generate and append the label for the current graph, formatted like LaTeX
    labels.append(r'$\mu = %.1f, \sigma = %.1f$' % (simParamPair[0], simParamPair[1]))

ax1.grid(b=True, which='major', axis='both') # Enable both major grids
ax1.set_xlim(xmin,xmax) # Set x limits
ax1.set_ylabel(r'$\varphi_{\mu,\sigma^2}(X)$') # Set y label, formatted like LaTeX
ax1.set_xlabel(r'$X$') # Set x label, formatted like LaTeX
ax1.set_title('Probability density function') # Set subplot title
ax1.legend(labels, loc='upper left', fontsize=9) # Add legend

ax2.grid(b=True, which='major', axis='both') # Enable both major grids
ax2.set_xlim(xmin,xmax) # Set x limits
ax2.set_ylabel(r'$\Phi_{\mu,\sigma^2}(X)$') # Set y label, formatted like LaTeX
ax2.set_xlabel(r'$X$') # Set x label, formatted like LaTeX
ax2.set_title('Cumulative distribution function') # Set subplot title
ax2.legend(labels, loc='upper left', fontsize=9) # Add legend

# Adjust the spacings between and around the subplot area
plt.subplots_adjust(top=0.88, bottom=0.1, left=0.12, right=0.95, hspace=0.5,
                    wspace=0.5)

# Save plot as png. Possible are: png, eps, pdf, pgf, ps, raw and svg
fig.savefig("gaussExtended.png")
 
plt.show() # Show plot

Mit Pythons pyplot.plot gespeichertes Bild

Gespeichertes Bild des Beispiels Gauss Extended

 

Meine Erkenntnisse zu Python statt MATLAB

  • Die Installation kann bereits die erste Herausforderung sein. Nutzt man Anaconda wird einem vieles abgenommen und das Einrichten ist unkompliziert.
  • Es gibt sehr viele unterschiedliche Arten wie man z.B. das 2. Beispiel aufbauen kann; Mit verschiedenen Array-Arten und entsprechenden for-Loops oder wie man mit den Axis-Handles jonglieren kann.
  • Viele Funktionen sind in zusätzlichen Paketen implementiert und müssen daher importiert werden. Funktionen, die importiert werden, müssen dann über die entsprechenden Namespaces respektive den zugewiesenen lokalen Namespace-Namen, bspw. plt und np, aufgerufen werden.
  • Die Dokumentation von MATLAB vermisse ich, da MATLAB für meinen Geschmack eine ausgezeichnete Dokumentation besitzt und ich sie häufig auch direkt aus der Konsole offline benutze.
  • Die Dokumentation der Funktionen aus den Paketen numpy und matplotlib.pyplot findet man natürlich online und können auch heruntergeladen werden.
  • Alles in allem finde ich Python sehr angenehm, um Berechnungen darzustellen und werde mich die nächsten Male nochmals damit auseinandersetzen.

Tag Cloud

.NET android ANgular AngularJs app Arduino ASP.Net automated testing Azure Big Data C# C++ Cloud continuous integration Elm Embedded gRPC Internet of Things IoT Java Javascript M2M OWASP Projektmanagement protobuf Python Raspberry Pi Reactive Programming REST Scrum Security Softwarequalität SPA Testen testing Testmanagement Teststrategie Visual Studio WebAPI windows WPF Xamarin Xamarin.Android Xamarin.Forms Xamarin.iOS

Archive

Current Posts

  • Kreative Interaktion mit Xamarin.Forms Touch-Actions
  • Angular vs. React: Ein pragmatischer Vergleich
  • Eine Alternative zu Azure Time Series Insights, bitte?
  • Focus on the Secure Storage service of Trusted Firmware (TFM)
  • ZeroMQ / NetMQ mit Protocobuf

Last Comments

  • Noser Blog Touch-Actions in Xamarin.Forms - Noser Blog bei Mach mehr aus Animationen in Xamarin.Forms mit SkiaSharp
  • Noser Blog Focus on the Secure Storage service of Trusted Firmware (TFM) - Noser Blog bei First run of the Trusted Firmware (TFM) application
  • Noser Blog First run of the Trusted Firmware (TFM) application - Noser Blog bei Focus on the Secure Storage service of Trusted Firmware (TFM)
  • Noser Blog Focus on the Secure Storage service of Trusted Firmware (TFM) - Noser Blog bei Security management with Trusted Firmware
  • Noser Blog ZeroMQ / NetMQ mit Protocobuf - Noser Blog bei Tutorial: Protocol Buffers in ASP.NET Core

Popular Posts

Xamarin.Android Code Obfuscation

6 Comments

ManuScripts: Wenn jemand eine Reise tut... Funktionale Programmierung mit Elm - Teil 1 - Aufbruch

5 Comments

ManuScripts: Wenn jemand eine Reise tut... Funktionale Programmierung mit Elm - Teil 2 - Kein Picknick

4 Comments

Contact us

  1. Name *
    * Please enter your name
  2. Email *
    * Please enter a valid email address
  3. Message *
    * Please enter message
© 2013 NOSER ENGINEERING AG. All rights reserved. Datenschutz | Cookie-Richtlinie