234

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

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

if not self.Definition.all():

这是解决方案吗?

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

4 回答 4

396

您可以随时查看.size属性。它被定义为一个整数0,当数组中没有元素时为零 ( ):

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

if a.size == 0:
    # Do something when `a` is empty
于 2012-07-02T14:38:48.983 回答
27

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 数组元素的总数。这等于形状元素的乘积。

于 2012-07-02T14:44:39.367 回答
22

一个警告,不过。注意 np.array(None).size 返回 1!这是因为 a.size等价于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
于 2019-06-22T11:44:52.497 回答
-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

但我(和大多数其他人)检查的shape不仅仅是size

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) 和len2。

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

答案真的取决于

  • “空”是什么意思?
  • 你真正测试的是什么?
于 2020-05-19T07:25:30.407 回答