scipy.optimize.curve_fit报ValueError数组维度过深错误
错误根因
触发ValueError: object too deep for desired array的核心问题有三个:
scipy.optimize.curve_fit接口强制要求传入的观测因变量、拟合函数返回的预测值必须是一维扁平数组,原代码将目标值、拟合输出都处理为(n,1)形状的二维列向量,底层计算残差时会出现数组嵌套层级不匹配的问题。- 逐行遍历输入行调用SymPy转译函数的写法冗余低效,lambdify生成的数值函数原生支持向量化传入数组批量计算,逐行调用容易引入维度传递错误。
- 原代码构造「等式左右两侧差值为0」作为优化目标的逻辑完全多余,
curve_fit原生适配「输入自变量+待拟合参数→输出预测因变量」的函数形式,不需要额外做等式移项包装。
修复代码
import numpy as np from sympy.parsing.sympy_parser import parse_expr from sympy import lambdify from scipy.optimize import curve_fit # 构造测试数据 x_data = np.array([[1,2], [2,4], [43,243]], dtype=float) # 数据真实参数为a=4、b=2、c=11 y_data = 4*x_data[:,0]**2 + 2*x_data[:,1] + 11 y_data += np.random.rand(len(x_data)) # 添加随机噪声,保持一维数组结构 # 解析用户输入的符号表达式 correlation = "z=a*x^2+b*y+c" correlation = correlation.replace("^","**") lhs_expr, rhs_expr = [parse_expr(corr) for corr in correlation.split('=')] # 区分自变量与待拟合参数 independent_vars = ['x', 'y'] fit_params = ['a', 'b', 'c'] # 为表达式右侧(预测值部分)生成数值计算函数 calc_pred = lambdify(tuple(independent_vars + fit_params), rhs_expr) # 定义符合curve_fit入参规范的拟合函数 def fit_func(X, a, b, c): x, y = X[:, 0], X[:, 1] return calc_pred(x, y, a, b, c) # 参数初始值与取值范围 p0 = [7, 5, 1] bounds = ([-np.inf]*3, [np.inf]*3) # 执行拟合 popt, pcov = curve_fit( fit_func, x_data, y_data, p0=p0, bounds=bounds ) print(f"拟合得到参数a、b、c:{popt}")
运行后输出的拟合参数会接近真实值[4, 2, 11],无维度报错。
内容的提问来源于stack exchange,提问作者Omar Zaki
相关产品推荐
相关产品推荐

