en / de
Expertisen
Methoden
Dienstleistungen
Referenzen
Jobs & Karriere
Firma
Technologie-Trends TechCast WebCast TechBlog News Events Academy

Python statt MATLAB – Der Einstieg

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 figureplot 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

Kommentare

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Newsletter - aktuelle Angebote, exklusive Tipps und spannende Neuigkeiten

 Jetzt anmelden
NACH OBEN
Zur Webcast Übersicht