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

使用curve_fit拟合二维函数时遇‘object too deep for desired array’错误求助

二维多项式拟合报错解决方案

错误原因分析

你遇到的ValueError: object too deep for desired array和error: Result from function call is not a proper array of floats,核心问题有三个:

  1. 自变量格式不匹配:curve_fit传入的(arr_x, arr_y)是两个一维数组的元组,不符合函数预期的输入格式;
  2. 多项式函数逻辑错误:当前polynomial_func无法批量处理多组x、y样本,返回结果不是一维浮点数组;
  3. 因变量维度问题:若g(arr_x, arr_y)返回二维数组,会和自变量的样本数不匹配。

修复后的代码

import numpy as np
from scipy.optimize import curve_fit

def poly(order, cov, x, y):
    z = 0.0
    for r in range(order + 1):
        for k in range(order + 1):
            # 修正系数索引:原索引会跳过元素,改为对应(order+1)×(order+1)的系数矩阵
            z += cov[r * (order + 1) + k] * (x ** r) * (y ** k)
    return z

def polynomial_func(x, y, *cov):
    order = int(np.sqrt(len(cov))) - 1
    # 利用numpy广播特性批量计算所有样本的预测值,返回一维数组
    return poly(order, cov, x, y)

k = int(input('Please type the order:')) 
U = sorted(list(u))
V = sorted(list(v))[300:501]
U = U * 201
V0 = []
for item in V:
    V0 = V0 + [item] * 151
V = V0

arr_x = np.array(U[::3])
arr_y = np.array(V[::3])
arr_z = g(arr_x, arr_y)
# 强制将因变量转为一维数组,确保和自变量样本数一致
arr_z = arr_z.flatten()

# 传入两个独立的一维数组作为自变量,适配curve_fit的参数格式
popt, pcov = curve_fit(polynomial_func, (arr_x, arr_y), arr_z, p0=[0.0] * (k+1)**2)
print(np.round(popt, 2))

关键修改说明

  • 修正系数索引:把r * order + k改为r*(order+1)+k,对应(order+1)阶多项式的完整系数矩阵索引;
  • 适配函数参数:polynomial_func改为接收x和y两个独立参数,匹配curve_fit传入的元组格式;
  • 扁平化因变量:用flatten()强制将arr_z转为一维数组,避免维度不匹配;
  • 批量计算支持:利用numpy的广播特性,让poly函数直接对一维数组运算,返回符合要求的一维预测结果数组。

内容的提问来源于stack exchange,提问作者Sinnaruil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:13:16