Scipy curve_fit报错求助:结果非有效浮点数组/对象维度过深
解决curve_fit报错:ValueError: object too deep for desired array
报错的核心原因是scipy.optimize.curve_fit要求输入的自变量和因变量必须是一维数组,但你传入的(X,Y)是二维网格数组,Z_noise也是二维数组,不符合函数的输入要求。
解决步骤很简单,只需要把多维数组展平成一维,拟合完成后再把结果恢复成原形状即可:
修改后的完整代码
### Import Libraries import numpy as np from scipy.optimize import curve_fit ### Define Function def Func(vars, C1, C2): (X, Y) = vars Z1 = (C1*Y**2) / (1+(1-(C1*Y)**2)**0.5) Z2 = (C2*X**2) / (1+(1-(C2*X)**2)**0.5) return Z1 + Z2 ### Y Data xL = np.linspace(0.0, 10, 11).flatten() ## Sub yL = np.linspace(0.0, 100, 101).flatten() ## Main X, Y = np.meshgrid(abs(xL), abs(yL)) ### Coefficient C1 = 0.002 C2 = 0.005 ### Calculate : Original and Noise Data Z_original = Func((X, Y), C1, C2) Z_noise = np.random.normal(size=(len(xL)*len(yL)), scale=0.5) Z_noise.resize(len(yL), len(xL)) Z_noise = Z_original + Z_noise ### Curve_Fit 修改部分 p0 = (0.002, 0.005) # 将(X,Y)展平为一维数组,Z_noise也展平为一维 popt, pcov = curve_fit(Func, (X.flatten(), Y.flatten()), Z_noise.flatten(), p0) # 拟合后计算结果,再reshape回原二维形状 Z_curvefit = Func((X,Y), *popt).reshape(Z_original.shape)
关键修改点
- 调用
curve_fit时,用X.flatten()和Y.flatten()把二维网格转成一维数组,同时Z_noise.flatten()把因变量也转成一维 - 计算
Z_curvefit后,用reshape(Z_original.shape)恢复成和原始数据一样的二维形状,方便后续对比或可视化
这样修改后,就能符合curve_fit的输入要求,解决报错问题。
内容的提问来源于stack exchange,提问作者YoungBok Kim
相关产品推荐
相关产品推荐

