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

282

我该如何检查一个numpy数组是否为空?

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

if not self.Definition.all():

这是解决方法吗?

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

7
len(array([])) 的值为 0。len(array([0])) 的值为 1。 - Steven Rumbalski
4
您想测试长度为零的数组、包含全零元素的数组,还是两者都测试?您对“空”的定义是什么? - John Lyon
15
但是 len(array([[]])) 也是1! - strpeter
len()函数返回第一维度中的元素数量。但是,如果数组在另一个轴上具有零维度,则其第一轴可以具有非零维度但仍为空。size更好,因为它是所有轴的乘积。 - asmeurer
4个回答

462

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

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

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

6
对于NumPy来说这很棒,但不幸的是,对于列表来说被视为违反Python风格的。请查看有关列表的讨论:https://dev59.com/o3VD5IYBdhLWcg3wNIvc 对于NumPy数组和列表使用相同的模式会很好。 - eric
1
通常情况下,NumPy代码在列表上不能正常工作,反之亦然。如果您使用列表与NumPy数组,则必须以不同的方式编写代码。 - asmeurer
11
如果a.size不为真,则相当于快速的等价于if not a.size: - Tian

29

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
数组的总元素数。这等于 shape 中所有元素的乘积。


27

需要注意的是,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

16
包含 None 对象的数组并不是一个空数组,在这里查看更多细节的答案 - DrBwts
3
@DrBwts这并不与本回答相关。 - vidstige
@DrBwts他的数组中不包含None对象。看一下它的形状。 - Navin
4
形状为()的数组是标量数组,它们包含一个元素(标量)。在这个例子中,标量是NoneNone没有特殊含义,这是一个对象数组)。具体取决于你正在做什么,但通常情况下,你不应将标量数组视为空数组。 - asmeurer

0
为什么要检查数组是否为空?数组不像列表那样可以增长或缩小。使用空数组并通过 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

但是我(以及大多数人)更多地检查形状而不是大小

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

它的另一个优点是它可以“映射”到一个列表:

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

但是还有其他大小为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),长度为2。

虽然“空”列表的概念很明确,但“空数组”的定义并不明确。一个空列表等于另一个空列表。但对于大小为0的数组来说,情况就不同了。

答案实际上取决于:

  • 你所指的“空”是什么意思?
  • 你真正想要测试什么?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接