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

调用numpy.hstack报TypeError: Add对象不可调用如何解决

numpy.hstack 触发 TypeError: 'Add' object is not callable 报错修复

报错根因

这个报错和np.hstack本身无关,错误提示说明你代码里调用的f不是之前定义的计算正弦平方和的Python函数,已经被SymPy符号运算库的Add类型(符号加法表达式对象)覆盖了,你相当于在尝试把一个表达式对象当函数调用,才会抛出"不可调用"的错误。

常见问题点

  • 你大概率是在编写梯度函数grad_f时用SymPy做符号求导,过程中把同名变量f赋值成了SymPy的符号表达式,覆盖了最开始定义的数值计算函数f。
  • 你贴出的代码存在缩进错误:history初始化、梯度下降循环、return语句都没有缩进在grad_descent_2d函数内部,直接运行会触发作用域错误,属于代码片段粘贴不全/书写缩进不规范的问题。
  • 你当前的np.hstack调用还存在维度不匹配隐患:curr_x是长度为2的一维数组,f(curr_x)返回的是单个浮点数标量,直接拼接会报维度错误。

修复步骤

  1. 检查grad_f的定义代码,不要直接把SymPy符号表达式当函数用,用sympy.lambdify把符号表达式转成兼容numpy数组的可调用数值函数,参考写法:
import sympy as sp
# 符号定义
x1, x2 = sp.symbols('x1 x2')
# f_sym是SymPy的Add类型表达式,不能直接当函数调用
f_sym = sp.sin(x1)**2 + sp.sin(x2)**2
# 转成numpy兼容的可调用函数
f = sp.lambdify([(x1, x2)], f_sym, 'numpy')
# 同理转换梯度函数
grad_f_sym = [sp.diff(f_sym, x1), sp.diff(f_sym, x2)]
grad_f = sp.lambdify([(x1, x2)], grad_f_sym, 'numpy')
  1. 修正grad_descent_2d的缩进和拼接逻辑,完整正确代码如下:
def grad_descent_2d(f, grad_f, lr, num_iter=100, x0=None):
    """
    二维函数梯度下降实现
    :param f: 二维标量函数
    :param grad_f: 返回f梯度的函数
    :param lr: 学习率
    :param num_iter: 梯度下降迭代次数
    :return: 每轮迭代的(x1, x2, f(x))记录数组
    """
    if x0 is None:
        x0 = np.random.random(2)
    history = []
    curr_x = x0.copy()
    for iter_num in range(num_iter):
        # 标量转单元素数组,保证hstack维度匹配
        step_record = np.hstack((curr_x, np.array([f(curr_x)])))
        history.append(step_record)
        curr_x = curr_x - lr * np.array(grad_f(curr_x))
    return np.vstack(history)
  1. 修正后再调用grad_descent_2d(f, grad_f, lr=0.1, num_iter=20)即可正常运行。

内容的提问来源于stack exchange,提问作者Константин О.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:24:23