如何判断一个全零的numpy数组不是空的?

3 投票
2 回答
791 浏览
提问于 2025-04-18 15:54

这是我的问题:

我使用numpy的any()函数来检查我的数组是否为空。

a = numpy.array([1., 2., 3.])
a.any()
#True


a = numpy.array([0., 0., 0.])
a.any()
#False

我本以为,因为0.是一个浮点数,numpy的any()函数会返回True。那我该怎么做才能让它返回True呢?

为什么numpy不把零视为实际的值呢?

我使用的是python 2.6

2 个回答

3

你看到的情况其实是正常的:any()的意思是“这个数组里有没有哪个元素的布尔值为真?”因为0的布尔值是假的(非零的数字是假的),所以当数组里全是零的时候,a.any()返回假也是很正常的。

你可以用bool()来检查任何Python对象的布尔值。

如果你想知道你的数组里有没有元素,可以检查a.size(如果没有元素,它的值是0)。

2

为什么在numpy中,零不被视为实际值呢?

在Python中有个普遍的原则,就是“假值”包括 FalseNone、数字零*,或者空的集合。具体的规则可以查看文档中的真值测试部分。** 不同的编程语言对什么算是真值或假值的定义是不一样的***;这些是Python的规则。

而NumPy也遵循这个原则。所以,零被视为实际值,但它们是实际的值。

因此,一个满是数字零的数组没有任何真值成员,所以调用 any 函数时会返回 False


* 注意,在某些情况下,四舍五入到 0.0 的值并不完全等于零,这种情况下它可能会被认为是“真”。这就是浮点数四舍五入错误的麻烦之处……如果你真的需要检查值是否非零,最好检查它们是否在某个合适的范围内,而不是检查确切的值。NumPy在这方面提供了很多有用的工具。

** 我没有提到自定义类型可以通过定义 __bool__ 方法来决定哪些值是“真”或“假”,或者根据你使用的Python版本的不同,可能有其他的替代方案。这是底层的工作原理。但对于设计这种类的人来说,她的类应该尽量遵循这个普遍原则;无论她的值被认为是“零”、“空”、“假”还是“不存在”,这就是她的 __bool__ 方法应该遵循的规则。

*** 在C语言家族中,通常零和NULL指针被视为假值。在Lisp语言家族中,只有空列表或相关的值被视为假值。在Ruby和Swift中,只有 falsenil 被视为假值。等等。任何规则在某些情况下都会让人感到不直观;只要语言及其生态系统保持一致,这就已经很好了。(如果你不得不使用不一致的语言,比如PHP或JavaScript,你得随时查阅文档……)

撰写回答