【问题标题】:Ignoring return values from scipy in Python在 Python 中忽略来自 scipy 的返回值
【发布时间】:2017-03-04 01:16:46
【问题描述】:

当我调用 SCIPY 函数时,我当然不想查看文档 [开玩笑] 但更严重的是我不想接受所有返回值。例如,我正在调用 FMIN_BFGS()。它可以选择返回一堆值,我只想保持返回的最小值。所以我输入

res = fmin_bfgs(...)

死于“太多值无法解压”。我以为我已经读过这会起作用

res, = fmin_bfgs(...)

但它给出了相同的错误消息。最后起作用的是使用问题#431866的答案

res, _, _ , _ = fmin_bfgs(...)

但真的吗?我是否必须检查文档并计算返回值的数量并使用那么多下划线,或者是否有更多 Pythonesque 方式来忽略除第一个值之外的所有返回值。

谢谢,J。

【问题讨论】:

标签: python scipy


【解决方案1】:

像这样的函数返回一个值的元组。 return 语句看起来像

 return arr1, scalar2, label3

发生这种情况时,您有多种选择:

 mytuple = foo(...)    # accept the tuple
 print(len(mytuple))    # look at the number of items
 val1= mytuple[0]      # select the 1st item

或者你可以使用元组解包选项

 a, b, c = mytuple
 a, b, c = foo(...)
 a, _, _ = foo(...)     # _ is just a name for unimportant value

您可以立即使用索引

 a = foo(...)[0]

 a, = foo(...)
 a, = (12,)   # works
 a, = (12,12,12)  # unpacking error

仅在 foo 返回单个项目元组时有效。作为执行此函数返回该元组计数的“规则”的一种方式,这是最有用的。左侧 , 的功能与右侧相同 - 指定一个元组。

所以这是一个基本的 Python 问题 - how to unpack or select items from a tuple。这对 Scipy 来说并不特别。

=================

但是快速浏览fmin_bfgs 表明我可以得到一个项目(不是元组解包),如果我要求完整输出,则可以得到 7 个项目,如果我要求更多值,则可以得到 8 个项目。

【讨论】:

    【解决方案2】:

    我的愚蠢错误。我的代码实际上是什么样子的

    res, l2e = fmin_bfgs(...)
    

    除了我没有将 res 定义为数组,就像我应该做的那样。所以解释器认为我给出了一个 size=2 的向量来填充从 fmin_bfgs 返回的 size=N 答案。一旦我在调用之前定义了 res=np.zeros(N) ,那么一切正常。

    很抱歉浪费了您的时间...

    【讨论】:

    • 那应该完全没有效果。
    • 在此调用之前res 的值不会影响此表达式的工作方式。这是一个赋值,而不是一个值插入。
    【解决方案3】:

    实际上,您的第一个示例将起作用:

    res = fmin_bfgs(...)
    

    然后您可以使用 res[0] 引用您感兴趣的值。

    仅在 python 3 中,您也可以这样做:

    res, *_ = fmin_bgfs(...)
    

    将元组中的第一个值分配给 res,将剩余的值作为新元组分配给 _。

    【讨论】:

      猜你喜欢
      • 2010-09-30
      • 2021-02-08
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      • 2021-10-03
      • 1970-01-01
      相关资源
      最近更新 更多