检查变量是否为None或numpy.array时的ValueError

问题描述 投票:72回答:3

我想检查变量是否为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()
python numpy is-empty
3个回答
128
投票

使用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:
    ...    

1
投票

你可以看到对象是否有形状

def check_array(x):
    try:
        x.shape
        return True
    except:
        return False

0
投票

如果你试图做一些非常相似的a is not None,同样的问题出现了:Numpy抱怨必须使用a.anya.all。解决方法是:

if not (a is None):
    pass

不太漂亮,但它完成了这项工作。

© www.soinside.com 2019 - 2024. All rights reserved.