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


104

我想检查变量是否为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()

2
ValueError是最常见的numpy问题之一。这意味着将not a生成一个布尔数组,该数组具有(在这种情况下)2个值。此布尔数组不能用作if条件!该is None方案是很好的了解,但你也应该明白这个错误。
hpaulj '16

@hpaulj:不太正确-您不能重载not,因此,当not尝试将数组视为单个布尔值而发现不能这样做时,实际上会发生错误。如果为~a,则将使用NumPy的重载,并在if尝试将取反数组用作单个布尔值时失败。
user2357112支持Monica19

Answers:


174

使用not a测试是否aNone假设的其他可能值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:
    ...    

4
您推荐哪个是“最佳”解决方案?
Monica Heddneck '19

2

如果您尝试执行非常相似的操作:a is not None,则会出现相同的问题。也就是说,Numpy抱怨必须使用a.anya.all

解决方法是:

if not (a is None):
    pass

不太漂亮,但是可以做到。


0

您可以查看对象是否具有形状

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

1
之所以投票,是因为:其他类型也可以具有shape属性,甚至可能具有不同的含义。
赫伯特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.