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

时间:2012-07-02 14:24:46

标签: python numpy

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

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

if not self.Definition.all():

这是解决方案吗?

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

4 个答案:

答案 0 :(得分:208)

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

import numpy as np
a = np.array([])

if a.size == 0:
    # Do something when `a` is empty

答案 1 :(得分:15)

http://www.scipy.org/Tentative_NumPy_Tutorial#head-6a1bc005bd80e1b19f812e1e64e0d25d50f99fe2

  

NumPy的主要对象是同构多维数组。在Numpy中,尺寸称为轴。轴数是等级。 Numpy的数组类称为ndarray。它也被别名数组所知。 ndarray对象的更重要的属性是:

     

ndarray.ndim
  数组的轴数(尺寸)。在Python世界中,维度的数量称为排名。

     

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

     

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

答案 2 :(得分:2)

不过,请注意。 请注意,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

答案 3 :(得分:-3)

我们为什么要检查数组是否为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

但是我(和大多数其他人)对shape的检查要比对size的检查要多:

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

另一有利之处是它“映射”到empty列表:

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

但是还有其他{0} size为0的其他数组,它们在最后意义上不是“空”的:

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数组,不能这么说。

答案真的取决于

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