调用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)返回的是单个浮点数标量,直接拼接会报维度错误。
修复步骤
- 检查
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')
- 修正
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)
- 修正后再调用
grad_descent_2d(f, grad_f, lr=0.1, num_iter=20)即可正常运行。
内容的提问来源于stack exchange,提问作者Константин О.
相关产品推荐
相关产品推荐

