【问题标题】:ValueError when checking if variable is None or numpy.array检查变量是否为 None 或 numpy.array 时出现 ValueError
【发布时间】:2016-08-15 12:00:05
【问题描述】:

我想检查变量是 None 还是 numpy.array。我已经实现了check_a 函数来做到这一点。

def check_a(a):
    if not a:
        print "please initialize a"

a = None
check_a(a)
a = np.array([1,2])
check_a(a)

但是,这段代码引发了 ValueError。什么是直截了当的方法?

ValueError                                Traceback (most recent call last)
<ipython-input-41-0201c81c185e> in <module>()
      6 check_a(a)
      7 a = np.array([1,2])
----> 8 check_a(a)

<ipython-input-41-0201c81c185e> in check_a(a)
      1 def check_a(a):
----> 2     if not a:
      3         print "please initialize a"
      4 
      5 a = None

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

【问题讨论】:

  • 这个ValueError 是最常见的numpy 问题之一。这意味着not a 产生一个布尔数组,(在这种情况下)有 2 个值。此布尔数组不能用作if 条件! is None 替代方案很高兴知道,但您也应该了解此错误。
  • @hpaulj:不完全——你不能重载not,所以当not 尝试将数组视为单个布尔值并发现它不能时,错误实际上会发生。如果它是~a,那么当if 尝试将取反数组用作单个布尔值时,它将使用 NumPy 的重载并失败。

标签: python numpy is-empty


【解决方案1】:

使用not a 测试a 是否为None 假设a 的其他可能值具有True 的真值。但是,大多数 NumPy 数组根本没有真值,无法对其应用not

如果您想测试一个对象是否为None,最通用、最可靠的方法是使用is 检查None

if a is None:
    ...
else:
    ...

这不依赖于具有真值的对象,因此它适用于 NumPy 数组。

请注意,测试必须是 is,而不是 ==is 是一个对象身份测试。 == 是参数所说的任何内容,NumPy 数组说这是广播的元素相等比较,产生一个布尔数组:

>>> a = numpy.arange(5)
>>> a == None
array([False, False, False, False, False])
>>> if a == None:
...     pass
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous.
 Use a.any() or a.all()

另一方面,如果你想测试一个对象是否是一个 NumPy 数组,你可以测试它的类型:

# Careful - the type is np.ndarray, not np.array. np.array is a factory function.
if type(a) is np.ndarray:
    ...
else:
    ...

您也可以使用isinstance,它还将为该类型的子类返回True(如果这是您想要的)。考虑到np.matrix 是多么可怕和不兼容,你可能并不真正想要这个:

# Again, ndarray, not array, because array is a factory function.
if isinstance(a, np.ndarray):
    ...
else:
    ...    

【讨论】:

  • 您推荐哪个是“最佳”解决方案?
  • 谢谢! isinstance(a, np.ndarray) 方式对我来说看起来最干净。我最近加入的公司会检查is not None,每次阅读它都会让我的蟒蛇警报响起。
【解决方案2】:

坚持==不考虑其他类型,以下也是可以的。
type(a) == type(None)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-02
    • 2018-01-04
    • 2021-10-20
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    相关资源
    最近更新 更多