【问题标题】:Check if variable is defined with Numpy array?检查变量是否用 Numpy 数组定义?
【发布时间】:2012-10-19 12:00:20
【问题描述】:

有时我想测试一个变量是0 还是None。在纯 Python 中,这很简单

foo == True

但是当foo 可能是一个 Numpy 对象(例如numpy.ndarray)时,这不再起作用并且我得到错误:

ValueError: The truth value of an array with more than one element is ambiguous. 
 Use a.any() or a.all()

在这种情况下,我想要a.any(),但是这在不可迭代的对象上会失败。

当然,我可以明确检查foo0 还是None,但我想知道是否有更优雅的方法来做到这一点。

如何检查任意对象(可迭代和不可迭代)是否为True

【问题讨论】:

  • 从 Python 上讲,它是 if foo - 这适用于大多数事情。不幸的是,您必须使用特殊情况 numpy.ndarray 或任何其他比 0、None、False、len() == 0 等同于 False 更复杂的类型。
  • 我通常使用array is None 检查 numpy 对象是否为 None,但这不会检查零。看到这里有一个类似的问题,stackoverflow.com/questions/5086178/…

标签: python numpy


【解决方案1】:

只需使用np.allnp.any 而不是.all 方法。 np.all 将创建一个数组,如果它还不是一个数组。

【讨论】:

  • 请注意,这并不适用于所有可迭代对象:np.any(False for _ in range(10)) 产生 True。 (当然,如果这是一个列表推导而不是生成器,它会起作用。)基本上,它评估可迭代实例的逻辑真相,而不是从内容中创建一个数组。您可以使用np.fromiter 解决此问题,但这是一个额外的步骤。尽管如此,如果您只想处理大多数情况,使用np.all 等是迄今为止最干净的解决方案。
  • 这似乎是一个合适的解决方案,谢谢!生成器异常对我来说并不是真正的问题,但很高兴知道存在潜在的陷阱。
【解决方案2】:

我使用的方法是假设在 try except 块中存在变量来包围语句:

try:
    do_something(foo)
except NameError:
    foo = something

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 2018-09-09
    • 2015-05-01
    • 1970-01-01
    • 2011-02-26
    • 2013-05-19
    • 2018-05-26
    • 2021-04-21
    相关资源
    最近更新 更多