【问题标题】:2D Gaussian Curve_fit with flawed data带有缺陷数据的二维高斯曲线拟合
【发布时间】: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


【解决方案1】:

我不明白我是如何得到这个错误的,因为 mask[:,:2] 是 (2,n)

不完全是 - mask[:, :2].shape(<i>n</i>, 2),所以它必须是 x, y = Var.T - 或者当然你可以将 mask[:, :2].T 传递给 curve_fit()

【讨论】:

  • 就这么简单.. 非常感谢!
猜你喜欢
  • 2021-10-14
  • 1970-01-01
  • 2015-04-05
  • 2018-12-10
  • 1970-01-01
  • 2012-06-12
  • 2012-04-25
  • 2015-07-21
  • 2019-05-11
相关资源
最近更新 更多