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

Python 如何检查numpy数组是否为空?,python,numpy,Python,Numpy,如何检查numpy数组是否为空 我使用了下面的代码,但如果数组包含零,则此操作将失败 if not self.Definition.all(): 这就是解决办法吗 if self.Definition == array( [] ): 您可以随时查看.size属性。当数组中没有元素时,它是零(0): import numpy as np a = np.array([]) if a.size == 0: # Do something when `a` is empty NumPy的

如何检查numpy数组是否为空

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

if not self.Definition.all():
这就是解决办法吗

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

您可以随时查看
.size
属性。当数组中没有元素时,它是零(
0
):

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

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

NumPy的主要对象是同构多维数组。在Numpy中,尺寸称为轴。轴的数量为秩。Numpy的数组类称为ndarray。别名数组也知道它。ndarray对象更重要的属性包括:

ndarray.ndim
阵列的轴数(尺寸)。在Python世界中,维度的数量被称为秩

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

n阵列大小
数组的元素总数。这等于形状元素的乘积

不过有一个警告。 请注意,np.array(None).size返回1! 这是因为a.尺寸np.产品(a.形状), 数组(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

为什么要检查数组是否为空?数组的大小与列表的大小不同。从一个“空”数组开始,然后随着
np.append而增长,这是新手经常犯的错误

中使用列表取决于其布尔值:

In [102]: bool([])                                                                       
Out[102]: False
In [103]: bool([1])                                                                      
Out[103]: True
但尝试对数组执行相同操作会产生(在版本1.18中):

bool(np.array([1,2])
产生了臭名昭著的歧义错误

编辑 公认的答案是
尺寸

In [11]: x = np.array([])
In [12]: x.size
Out[12]: 0
In [13]: x.shape
Out[13]: (0,)
但是我(和大多数其他人)检查的
形状比检查
大小要多:

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.数组([[],[])
的大小也是0,但形状(2,0)和
len
2

虽然
列表的概念定义良好,但
空数组
的定义不明确。一个空列表等于另一个空列表。大小为0的
数组不能这样说

答案确实取决于

  • 你说的“空”是什么意思
  • 你考试的真正目的是什么

  • len(array([]))
    为0。
    len(array([0])
    为1。是否要测试长度为零的数组、包含所有零的数组或两者都包含的数组?您对“空”的定义是什么?@StevenRumbalski:但是
    len(array([[])
    也为1!
    len
    给出了第一个轴上的维数。但是一个数组可以在第一个轴上有一个非零维数,但是如果它在另一个轴上有一个零维数,那么它仍然是空的。
    size
    更好,因为它是所有轴的乘积。包含
    None
    对象的数组不是空数组,@DrBwts与此无关s答案。@DrBwts他的数组不包含
    None
    对象。看看它的形状。具有形状
    ()
    的数组是标量数组,它确实包含一个元素(标量)。在本例中,标量是
    None
    None
    没有任何特殊意义,这只是一个对象数组)这取决于你在做什么,但是你很可能想把标量数组看作不是空的。这对于NUMPY来说是很好的,但是不幸的是它被认为是不带列表的。请检查列表的讨论:对于NUMPY数组和列表使用相同的模式是很好的。如果您使用的是列表和NumPy数组,则必须以不同的方式编写代码。如果不是a.size: