检查变量是否为None或numpy.array时发生ValueError
我想检查变量是否为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()
-
使用
nota
测试是否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: ...