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


169

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

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

if not self.Definition.all():

这是解决方案吗?

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

6
len(array( [] ))是0 len(array( [0] )是1
史蒂芬Rumbalski

3
您要测试零长度数组,包含全零的数组,还是同时测试两者?您对“空”的定义是什么?
约翰·里昂

12
@StevenRumbalski:但是len(array([[]])也是1!
strpeter 2014年

len()给出第一个轴上的尺寸数。但是数组在第一个轴上的维数可以为非零,但如果在另一个轴上的维数为零,则该数组仍为空。size更好,因为它是所有轴的乘积。
asmeurer

Answers:


303

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

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

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

4
这对numpy很有用,但不幸的是,对于列表而言,它被认为是非Python的。请查看有关列表的讨论:stackoverflow.com/questions/53513/… 最好将相同的模式用于numpy数组和列表。
eric

通常,NumPy代码在列表上无法正常工作,反之亦然。如果使用列表和NumPy数组,则必须以不同的方式编写代码。
asmeurer

22

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


10

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

7
包含None对象的数组不是空数组,有关更多详细信息
DrBwts

1
@DrBwts与这个答案无关。
vidstige,

@DrBwts他的数组不包含该None对象。看它的形状。
纳文

具有形状()的数组是标量数组,它确实包含一个元素(标量)。在此示例中,标量为NoneNone没有任何特殊含义,这只是一个对象数组)。这取决于您正在执行的操作,但是您很可能确实希望将标量数组视为不为空。
asmeurer

-1

我们为什么要检查数组是否为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])产生臭名昭著的歧义错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.