使用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,核心问题有三个:
- 自变量格式不匹配:
curve_fit传入的(arr_x, arr_y)是两个一维数组的元组,不符合函数预期的输入格式; - 多项式函数逻辑错误:当前
polynomial_func无法批量处理多组x、y样本,返回结果不是一维浮点数组; - 因变量维度问题:若
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
相关产品推荐
相关产品推荐

