【发布时间】:2021-06-29 04:00:18
【问题描述】:
我一直在尝试将二维高斯拟合到我的数据中。我有一个 (x,y) 地图和每个坐标的 z 值。但是,我想摆脱一些 z 值,但是由于 curve_fit 要求将数组作为 (x,y) 参数,因此很难摆脱 (x,y) 数组中对应的 (x,y) 值。
我看到有很多解决方案(掩码数组,lmfit),但我选择了一个更简单的解决方案,因为我不太擅长 python。
这是我的代码:
def gaussienne(Var, xo, yo, backgr, gx, gy, theta):
x,y = Var
a = np.cos(theta)**2/(2*gx**2) + np.sin(theta)**2/(2*gy**2)
b = -np.sin(2*theta)/(4*gx**2) + np.sin(2*theta)/(4*gy**2)
c = np.sin(theta)**2/(2*gx**2) + np.cos(theta)**2/(2*gy**2)
res=backgr+np.exp(-(a*(x-xo)**2 + 2*b*(x-xo)*(y-yo)+ c*(y-yo)**2))
return res.ravel()
x=np.linspace(start_x,start_x+(taille_x)*step_x, taille_x)
y=np.linspace(start_y,start_y+(taille_y)*step_y, taille_y)
mask=[]
intensite=intensite.reshape(taille_x, taille_y)
for i in range(taille_x):
for j in range (taille_y):
if intensite[i,j]!=0:
mask.append([x[i],y[j],intensite[i,j]])
mask=np.array(mask)
p0 = a, b, 80, 0.2, 0.2, 0.001
popt, pcov = curve_fit(gaussienne, mask[:,:2], mask[:,2], p0, maxfev=5000)
基本上,对于我想要取的每个 z 值(即不等于 0),我添加以屏蔽 z 值和对应的 (x,y) 坐标。掩码是一个元组列表。我把它变成一个数组,然后交给curve_fit。
然后我得到错误:ValueError: too many values to unpack (expected 2)
我不明白我是如何得到这个错误的,因为 mask[:,:2] 是 (2,n) 而 mask[:,2] 是 (1,n)
感谢您的帮助
【问题讨论】:
-
start_x, start_y, taille_x, taille_y, step_x, step_y = ?
-
我从另一个函数中获取这些值。 x 和 y 的长度并不总是相同。
标签: python numpy matplotlib