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

发布于 2021-01-29 17:59:29

我想检查变量是否为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()
关注者
0
被浏览
48
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    使用nota测试是否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:
        ...
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看