You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 02:18:35