【问题标题】:How can I check whether a numpy array is empty or not?如何检查 numpy 数组是否为空?
【发布时间】:2012-07-02 23:33:34
【问题描述】:

如何检查 numpy 数组是否为空?

我使用了以下代码,但如果数组包含零,则失败。

if not self.Definition.all():

这是解决方案吗?

if self.Definition == array( [] ):

【问题讨论】:

  • len(array( [] )) 是 0。len(array( [0] ) 是 1。
  • 您要测试长度为零的数组、包含全零的数组,还是两者兼而有之?你对“空”的定义是什么?
  • @StevenRumbalski:但len(array([[]]) 也是 1!
  • len() 给出第一个轴的维数。但是一个数组在第一个轴上可以有一个非零维度,但如果它在另一个轴上有一个零维度,它仍然是空的。 size 更好,因为它是所有轴的乘积。

标签: python numpy


【解决方案1】:

https://numpy.org/devdocs/user/quickstart.html (2020.04.08)

NumPy 的主要对象是齐次多维数组。它是一个元素表(通常是数字),所有类型相同,由非负整数元组索引。在 NumPy 中,维度称为轴。 (...) NumPy 的数组类称为 ndarray。 (...) ndarray 对象更重要的属性是:

ndarray.ndim
数组的轴数(维度)。

ndarray.shape
数组的维度。这是一个整数元组,表示每个维度中数组的大小。对于具有 n 行和 m 列的矩阵,形状将为 (n,m)。因此,形状元组的长度就是轴的数量,ndim。

ndarray.size 数组的元素总数。这等于形状元素的乘积。

【讨论】:

    【解决方案2】:

    我们为什么要检查一个数组是否为empty?数组不会像列表那样增长或收缩。从一个“空”数组开始,到np.append 增长是一个常见的新手错误。

    if alist: 中使用列表取决于其布尔值:

    In [102]: bool([])                                                                       
    Out[102]: False
    In [103]: bool([1])                                                                      
    Out[103]: True
    

    但尝试对数组执行相同操作会产生(在 1.18 版中):

    In [104]: bool(np.array([]))                                                             
    /usr/local/bin/ipython3:1: DeprecationWarning: The truth value 
       of an empty array is ambiguous. Returning False, but in 
       future this will result in an error. Use `array.size > 0` to 
       check that an array is not empty.
      #!/usr/bin/python3
    Out[104]: False
    
    In [105]: bool(np.array([1]))                                                            
    Out[105]: True
    

    bool(np.array([1,2]) 会产生臭名昭著的歧义错误。

    编辑

    接受的答案建议size

    In [11]: x = np.array([])
    In [12]: x.size
    Out[12]: 0
    

    但我(和大多数其他人)检查shapesize 更多:

    In [13]: x.shape
    Out[13]: (0,)
    

    对它有利的另一件事是它“映射”到empty 列表:

    In [14]: x.tolist()
    Out[14]: []
    

    但还有其他具有 0 size 的数组,在最后一种意义上不是“空”的:

    In [15]: x = np.array([[]])
    In [16]: x.size
    Out[16]: 0
    In [17]: x.shape
    Out[17]: (1, 0)
    In [18]: x.tolist()
    Out[18]: [[]]
    In [19]: bool(x.tolist())
    Out[19]: True
    

    np.array([[],[]]) 也是大小 0,但形状 (2,0) 和 len 2。

    虽然empty 列表的概念定义明确,但empty array 定义不明确。一个空列表等于另一个。对于size 0 数组则不能这样说。

    答案真的取决于

    • “空”是什么意思?
    • 您真正测试的是什么?

    【讨论】:

      【解决方案3】:

      但有一点需要注意。 注意 np.array(None).size 返回 1! 这是因为 a.size is equivalent to np.prod(a.shape), np.array(None).shape为(),空积为1。

      >>> import numpy as np
      >>> np.array(None).size
      1
      >>> np.array(None).shape
      ()
      >>> np.prod(())
      1.0
      

      因此,我使用以下方法来测试一个 numpy 数组是否有元素:

      >>> def elements(array):
          ...     return array.ndim and array.size
      
      >>> elements(np.array(None))
      0
      >>> elements(np.array([]))
      0
      >>> elements(np.zeros((2,3,4)))
      24
      

      【讨论】:

      • 包含None对象的数组不是空数组,see the answers here for further details
      • @DrBwts 与此答案无关。
      • @DrBwts 他的数组不包含None 对象。看看它的形状。
      • 形状为() 的数组是标量数组,其中包含一个元素(标量)。在本例中,标量为NoneNone 没有任何特殊含义,这只是一个对象数组)。这取决于您在做什么,但您很可能确实希望将标量数组视为非空数组。
      【解决方案4】:

      您可以随时查看.size 属性。它是defined as an integer,当数组中没有元素时为零(0):

      import numpy as np
      a = np.array([])
      
      if a.size == 0:
          # Do something when `a` is empty
      

      【讨论】:

      • 这对 numpy 来说很棒,但不幸的是它被认为是不适合列表的。查看列表的讨论:stackoverflow.com/questions/53513/… 对 numpy 数组和列表使用相同的模式会很好。
      • NumPy 代码通常不能在列表上正常工作,反之亦然。如果您使用列表与 NumPy 数组,则必须以不同的方式编写代码。
      • 快速等效的if not a.size:
      猜你喜欢
      • 2023-01-07
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-13
      • 2011-07-02
      相关资源
      最近更新 更多