检查变量是 Nothing 还是 numpy.array 时的 ValueError

我想检查变量是 Nothing 还是 numpy.array。

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()
178982 次浏览

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

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