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

执行approx_fprime时遇ValueError:用序列设置数组元素

解决scipy.optimize.approx_fprime中的ValueError: setting an array element with a sequence错误

你遇到的这个错误核心原因很明确:scipy.optimize.approx_fprime要求目标函数必须返回标量值,但你最初定义的J(x)函数返回的是一个数组,这和它的预期输入输出不匹配。

原代码的问题分析

来看你最初的函数:

def J(x):
    return x*x

当你传入xk.ravel()(一个长度为9的一维数组)时,x*x会执行元素级别的乘法,返回一个同样长度的数组,而不是单个数值。approx_fprime在计算数值梯度时,需要对每个维度的参数做微小扰动,然后计算函数输出的差分——如果函数返回的是数组,它无法完成这个差分计算,因此抛出ValueError。

修正方案

你自己已经找对了正确的方向:把目标函数修改为返回标量。修正后的函数用np.sum(x**2)对所有元素的平方求和,确保无论输入的一维数组长度是多少,最终返回的都是单个数值:

def J(x):
    return np.sum(x**2)

完整修正代码

import numpy as np
import scipy.optimize as op

def J(x):
    return np.sum(x**2)

xk = np.arange(1,10).reshape(3,3).astype('float32')
print(op.approx_fprime(xk.ravel(), J, 0.01))

运行这段代码后,你会得到近似的梯度值,对于J(x)=sum(x²)这个函数来说,理论梯度是2x,所以输出结果会和2*xk.ravel()非常接近(由于使用了0.01的扰动步长,会存在微小的数值误差)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:07:54