ich würde gerne einen 2D Gauß an meine Daten fitten. Mein Problem ist dabei allerdings, dass ich nur Messdaten auf der x und y Achse habe und die auch nicht äquidistant sind, allerdings auf den Achsen gleich. Der Gauß dient hier lediglich als hoffentlich einfacheres Beispiel, die echte Funktion ist z.B. nicht radial symmetrisch. Auf Stackoverflow findet man z.B. das http://stackoverflow.com/questions/2156 ... rror-and-m die Lösung setzt allerdings glaub ich vorraus, dass man überall Daten hat. Ich hab es jedenfalls nicht geschafft dass auf mein Problem anzuwenden. Lösung hierfür könnte scipy.interpolate.griddata sein, allerdings finde ich das ziemlich umständlich (und hab es auch wieder nicht hinbekommen).
So sieht das ganze bei mir aus. xdata und ydata sind unterschiedliche Gaußkurven an die ich jetzt gerne einen 2D Gauß fitten würde. Ich hatte schon versucht aus xdata und ydata eine große Matrix zu machen wo alle "nicht Achsen Elemente" auf np.nan gesetzt werden, aber auch das mag scipy nicht,
Code: Alles auswählen
import scipy.optimize as opt
from scipy.interpolate import griddata
import numpy as np
import pylab as plt
def Gaus2D((x, y), amplitude, x0, y0, sigma_x, sigma_y):
gaus = amplitude * np.exp(-((x-x0)**2/(2*sigma_x**2) + (y-y0)**2/(2*sigma_y**2)))
return gaus.ravel()
def Gaus1D(x,x0,sigma):
return np.exp(-np.power((x - x0)/(2.*sigma), 2.))
if __name__ == '__main__':
x = np.array([-70,-40,-20,-10,-5,0,5,10,20,40,70])
y = np.array([-70,-40,-20,-10,-5,0,5,10,20,40,70])
xdata = Gaus1D(x, 0, 50)
ydata = Gaus1D(y, 0, 80)
# wenn data jetzt ein "volles" 2D data array wäre
initial_guess = (1,0,0,20,40)
popt, pcov = opt.curve_fit(Gaus2D, (x,y), data, p0 = initial_guess)