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

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

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

if not self.Definition.all():

这就是解决方案吗?

if self.Definition == array([]):
340440 次浏览

你总是可以看一下.size属性。它是定义为整数,当数组中没有元素时为0 (0):

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


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

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

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

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

< >强ndarray.size 数组元素的总数。它等于形状元素的乘积

不过,有一个警告。 注意np.array(None)。大小返回1! 这是因为a.size 等于 np.prod(a.shape) np.array(没有)。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

为什么要检查数组是否为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]: []

但是还有其他数组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数组则不能这样说。

答案真的要视情况而定

  • 你说的“空”是什么意思?
  • 你到底在测试什么?