2D高斯curve_fit拟合过滤无效值时报解包错误求助
报错原因
核心问题出在传入拟合函数的参数维度不匹配:
- 你构建的
mask数组形状为(n, 3)(n为有效数据点数量),因此mask[:,:2]的实际形状是(n, 2),而非你以为的(2, n) - 拟合函数
gaussienne中执行x,y = Var时,会尝试拆分Var的第一个维度,也就是把n个元素拆成2个变量,自然会触发too many values to unpack (expected 2)的错误
修复方案
只需要把传入curve_fit的坐标参数转置,把形状从(n, 2)调整为(2, n)即可,修改调用行:
# 原错误代码 # popt, pcov = curve_fit(gaussienne, mask[:,:2], mask[:,2], p0, maxfev=5000) # 修复后代码 popt, pcov = curve_fit(gaussienne, mask[:,:2].T, mask[:,2], p0, maxfev=5000)
可选优化:替换双层循环
你当前用双层循环筛选有效数据的写法可以用numpy向量化操作简化,运行效率更高,也更不易出错:
# 先生成完整坐标网格 X, Y = np.meshgrid(x, y, indexing='ij') # 直接用掩码筛选非零的intensite对应坐标和值 valid_mask = intensite != 0 x_valid = X[valid_mask] y_valid = Y[valid_mask] z_valid = intensite[valid_mask] # 组装参数传入拟合 popt, pcov = curve_fit(gaussienne, np.stack([x_valid, y_valid]), z_valid, p0, maxfev=5000)
内容的提问来源于stack exchange,提问作者Mayo
相关产品推荐
相关产品推荐

