我该如何检查一个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
a.size
不为真,则相当于快速的等价于if not a.size:
。 - Tianhttps://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 中所有元素的乘积。
需要注意的是,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
>>> 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
None
对象。看一下它的形状。 - Navin()
的数组是标量数组,它们包含一个元素(标量)。在这个例子中,标量是None
(None
没有特殊含义,这是一个对象数组)。具体取决于你正在做什么,但通常情况下,你不应将标量数组视为空数组。 - asmeurerIn [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的数组来说,情况就不同了。
答案实际上取决于:
len(array([]))
的值为 0。len(array([0]))
的值为 1。 - Steven Rumbalskilen(array([[]]))
也是1! - strpeterlen()
函数返回第一维度中的元素数量。但是,如果数组在另一个轴上具有零维度,则其第一轴可以具有非零维度但仍为空。size
更好,因为它是所有轴的乘积。 - asmeurer