【问题标题】:TypeError: 'numpy.float64' object is not callable in fmin numpyTypeError:“numpy.float64”对象在 fmin numpy 中不可调用
【发布时间】:2020-09-11 08:20:49
【问题描述】:

我正在尝试运行以下脚本,我认为 (Fmin) 有错误。我有以下错误:

TypeError: 'numpy.float64' 对象不可调用

非常感谢,我尝试了很多解决它,但我无法...再次感谢

   import numpy as n
   from scipy import optimize
        a=2
        b=3
        def f (ts):
            c= ts
            y= optimize.fmin(np.linalg.norm(a/c +b),x0=0.1)
            return y
        f2=np.vectorize(f)
        ts=np.linspace(1,50)

   print(f2(ts))

【问题讨论】:

    标签: python numpy typeerror


    【解决方案1】:

    搜索其他TypeError: ... is not callable 问题。这意味着您通过在需要可调用对象的地方传递不可调用对象而犯了编程错误。在 Python 中,“可调用”通常表示函数(或任何接受 obj() 语法的对象。scipy.optimize API 通常将函数作为第一个参数,即您希望优化的目标函数。

    表达式np.linalg.norm(a/b + c) 不是函数。您只是在一个参数上评估函数并返回结果。从您的代码中不清楚您要优化哪些变量。假设它是cab 固定)(尽管你应该真正称它为x——按照惯例,在拉丁字母表中使用高位字母很常见,例如wxyz 作为自变量,以及像 abc 这样的小写字母作为常量——当然,这是高度上下文和领域特定的)。那么你可能会这样做

    from np.linalg import norm
    optimize.fmin(lambda x: norm(a/x + b), x0=0.01)
    

    这里的lambda x: 运算符定义了一个内联单参数函数,该函数在单个变量上实现您的目标函数。 O当然,您也可以将所有abc 一起优化为一个向量。但你还没有具体说明你要解决什么问题,所以我将把它留作练习。

    我应该补充一下,使用np.vectorize 你的方式很慢。您可以在数组上使用fmin

    【讨论】:

      【解决方案2】:
      optimize.fmin()
      

      将第一个参数作为可调用函数,但它提供了一个 float64 对象,即 np.linalg.norm(a/c +b) 的返回值

      【讨论】:

      • 谢谢,但是如何解决这样的问题呢?
      • 在下面查看@Iguananaut 的回答,她传递了一个 lambda 函数作为第一个参数。此外,请尝试编辑代码,因为不清楚您在代码中的目标是什么。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-26
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多