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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 01:27:10