使用Scipy计算含Numpy叉积函数的Hessian矩阵报错求助
解决包含Numpy叉积的函数Hessian矩阵计算错误
问题原因
你遇到的ValueError是因为scipy.differentiate.hessian会向量化传递输入数组:它会把输入x0扩展为形状类似(m, k)的二维数组(m是输入维度,k是批量计算的点数)。此时原函数中x[0:3]会取数组的前3行而非前3个元素,导致叉积计算的维度不符合np.cross的要求(需要2或3维向量,而非二维数组的行切片)。
解决方案1:修改函数适配向量化输入
将函数修改为支持二维输入(每行对应一个样本点),确保叉积计算的维度正确:
import numpy as np from scipy.differentiate import hessian def func(x): # 兼容一维输入(测试点)和二维输入(hessian批量计算) if x.ndim == 1: x = x.reshape(1, -1) # 提取每个样本的前3个和后3个元素 vec1 = x[:, :3] vec2 = x[:, 3:] # 计算叉积并对每个样本的结果求和 return np.sum(np.cross(vec1, vec2), axis=1) x0 = np.array([1,2,3,4,5,6]) H = hessian(func, x0) print(H)
解决方案2:使用autograd库更简便计算
如果不想修改原函数,可以使用autograd库,它的hessian函数直接支持标量输出的一维输入函数,无需适配向量化:
import autograd.numpy as np from autograd import hessian def func(x): return np.sum(np.cross(x[:3], x[3:])) x0 = np.array([1,2,3,4,5,6]) H = hessian(func)(x0) print(H)
说明
- 方案1的核心是让函数能处理scipy hessian传递的二维批量输入,通过切片
x[:, :3]和x[:, 3:]获取每个样本的向量,再计算叉积。 - 方案2利用autograd的自动微分机制,无需修改原函数,直接计算hessian,更适合简单场景。
内容的提问来源于stack exchange,提问作者CW279
相关产品推荐
相关产品推荐

