如何检查numpy数组是否为空?
我使用了下面的代码,但如果数组包含0,则失败。
if not self.Definition.all():
这就是解决方案吗?
if self.Definition == array([]):
如何检查numpy数组是否为空?
我使用了下面的代码,但如果数组包含0,则失败。
if not self.Definition.all():
这就是解决方案吗?
if self.Definition == array([]):
当前回答
为什么要检查数组是否为空?数组不会像列表那样增长或缩小。从一个“空”数组开始,随着np增长。追加是新手经常犯的错误。
在if list中使用列表取决于它的布尔值:
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])会产生臭名昭著的歧义错误。
edit
公认的答案是大小:
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,但shape(2,0)和len 2。
虽然空列表的概念定义得很好,但空数组的定义却不是很好。一个空列表等于另一个。对于大小为0的数组,情况就不同了。
答案真的要视情况而定
你说的“空”是什么意思? 你到底在测试什么?
其他回答
您可以查看.size属性。它被定义为一个整数,当数组中没有元素时为零(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’s main object is the homogeneous multidimensional array. It is a table of elements (usually numbers), all of the same type, indexed by a tuple of non-negative integers. In NumPy dimensions are called axes. (...) NumPy’s array class is called ndarray. (...) The more important attributes of an ndarray object are: ndarray.ndim the number of axes (dimensions) of the array. ndarray.shape the dimensions of the array. This is a tuple of integers indicating the size of the array in each dimension. For a matrix with n rows and m columns, shape will be (n,m). The length of the shape tuple is therefore the number of axes, ndim. ndarray.size the total number of elements of the array. This is equal to the product of the elements of shape.
为什么要检查数组是否为空?数组不会像列表那样增长或缩小。从一个“空”数组开始,随着np增长。追加是新手经常犯的错误。
在if list中使用列表取决于它的布尔值:
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])会产生臭名昭著的歧义错误。
edit
公认的答案是大小:
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,但shape(2,0)和len 2。
虽然空列表的概念定义得很好,但空数组的定义却不是很好。一个空列表等于另一个。对于大小为0的数组,情况就不同了。
答案真的要视情况而定
你说的“空”是什么意思? 你到底在测试什么?
不过,有一点需要注意。 注意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