import numpy as np
# Listen können mittels np.array in Arrays konvertiert werden
x = np.array([1, 2, 3, 4, 5])
2 * x
# x + x
x**2
x**x
np.cos(x)
Achtung: Man braucht das cos
aus numpy!
import math
#math.cos(x)
Funktionen, die nur für eine Zahl geschrieben wurden, funktionieren oft ohne Änderung mit Arrays!
def poly(y):
return y + 2 * y**2 - y**3
poly(x)
Das erlaubt es einem unter anderem sehr leicht physikalische Formeln auf seine Datenpunkte anzuwenden.
Arrays können beliebige Dimension haben:
# zweidimensionales Array
y = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
y + y
Das erlaubt es z.B. eine ganze Tabelle als ein Array abzuspeichern.
Es gibt viele nützliche Funktionen, die bei der Erstellung von Arrays helfen:
np.zeros(10)
np.ones(5)
np.linspace(0, 1, 11)
# wie range() für arrays:
np.arange(0, 10)
Numpy erlaubt einem sehr bequem bestimmte Elemente aus einem Array auszuwählen
x = np.arange(0, 10)
# kennen wir schon:
x[4]
# alle Elemente mit Index 1 bis 3:
x[1:4]
# negative Indizes zählen vom Ende des Arrays:
x[-1], x[-2]
# Kombination aus beiden:
x[3:-2]
# man kann eine Schrittgröße angeben
x[::2]
# Trick zum Umkehren: negative Schrittgröße
x[::-1]
y = np.array([x, x + 10, x + 20, x + 30])
y
# mehrere Indizes mit Kommas getrennt:
y[3, 2:-1]
# Oder man gibt nur einen Index an ⇒ eindimensionales Array
y[2]
Oft will man Elemente auswählen, die eine bestimmte Bedingung erfüllen.
Hierzu erstellt man zuerst eine Maske (Arrays aus True/False-Werten).
Diese kann man in eckigen Klammern übergeben.
a = np.linspace(0, 2, 11)
b = a**2
a[a>=1]
#a[b==a]
#a[b>a]
Viele Rechenoperationen reduzieren ein Array auf einen einzelnen Wert
x
np.sum(x)
np.prod(x)
np.mean(x)
# Standardabweichung:
np.std(x)
# Fehler des Mittelwerts (geht auch einfacher):
np.std(x) / np.sqrt(len(x))
# Differenzen zwischen benachbarten Elementen
np.diff(x**2)
Einlesen aus Textdateien: genfromtxt
Sie gibt den Inhalt einer Textdatei als Array zurück.
Das Gegenstück ist savetxt
.
n = np.arange(11)
x = np.linspace(0, 1, 11)
np.savetxt('test.txt', [n, x])
print(open('test.txt', 'r').read())
Man sollte aber immer erklären, was man da abspeichert:
n = np.arange(11)
x = np.linspace(0, 1, 11)
# header schreibt eine Kommentarzeile in die erste Zeile der Datei
np.savetxt('test.txt', [n, x], header="n \t x")
print(open('test.txt', 'r').read())
Einlesen der Werte mit genfromtxt
:
a, b = np.genfromtxt('test.txt')
print(a)
print(b)
Oft schreibt man seine Datenpunkte aber spaltenweise:
1 1
2 4
3 9
4 16
5 20
Dann kann man unpack=True
verwenden, um die Daten zu transponieren. Um die Daten entsprechend transponiert zu speichern, verwenden wir
np.savetxt('test_T.txt', np.array([n, x]).T)
print(open('test_T.txt', 'r').read())
# Fehler des Mittelwerts:
from scipy.stats import sem # standard error of mean
sem(x)
# Physikalische Konstanten:
import scipy.constants as const
const.epsilon_0
# Temperaturen konvertieren:
const.C2K(100), const.K2C(100)
# Winkel konvertieren:
np.degrees(np.pi), np.radians(90)
# noch mehr Konstanten (mit Einheit und Fehler)!
list(const.physical_constants.items())[:10]
Wenn solche Konstanten genutzt werden, muss das korrekt mitgeteilt, also zitiert werden. Darauf gehen wir nächste Woche im LaTeX-Workshop ein :-)
(Quelle hier: python-scipy)
# physical_constants ist ein dict in dem hinter keys
# Wert, Einheit und Fehler hinterlegt sind
const.physical_constants["proton mass"]
Oft möchte man eine Funktion, zum Beispiel eine Erwartung aus der Theorie, an die gemessenen Werte anpassen. Dies nennt man Fit.
# Beliebige Funktionen fitten
%matplotlib inline
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (10, 8)
plt.rcParams['font.size'] = 16
x, y = np.genfromtxt('example_data.txt', unpack=True)
def f(x, a, b):
return a * x + b
params, covariance = curve_fit(f, x, y)
# covariance ist die Kovarianzmatrix
errors = np.sqrt(np.diag(covariance))
print('a =', params[0], '±', errors[0])
print('b =', params[1], '±', errors[1])
x_plot = np.linspace(0, 10)
plt.plot(x, y, 'rx', label="example data")
plt.plot(x_plot, f(x_plot, *params), 'b-', label='linearer Fit')
plt.legend(loc="best")