如何判断一个由numpy数组的零元素组成的数组不为空?

3

以下是我的问题:

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

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


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

我认为,考虑到0.是一个浮点数,来自numpy的any()函数应该返回True。我该如何做到这一点?

为什么numpy不将零视为实际值?

我使用的是Python 2.6。


它们被认为是“实际值”,只不过是计算结果为False的实际值。 - jonrsharpe
1
@jonrsharpe:小心;它们实际上并不评估为“False”,但它们确实评估为假值。这就是为什么社区有“真值”和“假值”这些术语,以避免混淆。好吧,还有为了固执地提醒每个人,在 Stephen Colbert 之前,Python 社区中的某个人想出了“真值”的概念。 :) - abarnert
@abarnert 很好的观点,谢谢。 - jonrsharpe
2个回答

3
你所观察到的其实是预期中的结果:any() 的意思是 "数组中是否有任何一个元素的布尔值为 true?"。由于 0. 的布尔值为 false(非零数为 true),所以当数组只包含零时,a.any() 为 false 是正常的。
你可以使用 bool() 检查任何 Python 对象的布尔值。
如果你需要知道数组中是否有任何元素,则可以测试 a.size(没有元素则为 0)。

2
numpy不将零视为实际值的原因是什么?
这是Python的一个通用原则,即“falsey”意味着False、None、数字零*或空集合。请参见文档中的Truth Value Testing以获取确切的规则。**不同的语言对于什么算作真值和假值有不同的规则***,这是Python的规则。
NumPy遵循这个通用原则。因此,零被视为实际值,但它们是实际的值。
因此,由数值零值组成的数组没有任何真值成员,因此在其上调用any将返回False
请注意,在某些情况下,四舍五入为0.0的值并不完全等于零,这时它可能会被误认为是真实的,这是浮点数舍入误差的又一种令人困惑的表现...如果您确实需要检查这些值是否非零,请检查它们是否在某个适当的epsilon范围内,而不是检查精确值。NumPy在这方面有许多有用的辅助函数。
我省略了一条规则:自定义类型可以通过定义__bool__方法或各种回退方法(取决于您的Python版本)来决定哪些值为真或假。这就是底层的工作原理。但对于这样一个类的设计者来说,她的类应该遵循通用原则;对于她的值来说,“零”、“空”、“假”或“不存在”的含义是什么,这就是她的__bool__方法应该遵循的规则。
在C语言家族中,通常是零和空指针是假的。在Lisp语言家族中,只有空列表或密切相关的值是假的。在Ruby和Swift中,只有false和nil是假的。等等。任何规则在某些情况下都会违反直觉; 只要语言及其生态系统保持一致,这就是你所能希望的。 (如果您必须使用不一致的语言,例如PHP或JavaScript,则必须随时查看文档...)

好的。我不知道那个。对我来说,返回一个浮点值为False似乎是违反直觉的(特别是在数组的情况下,得到零作为结果是很可能的),但如果事实如此,那就没问题了! - William Abma
@WilliamAbma: 每种语言都有自己真实性的规则,而你制定的每一个规则在某些情况下会是不直观的,但在其他情况下则不然;只要一种语言(以及它的标准库和流行的第三方库)是一致的,那就是你所期望的。 - abarnert
并不是所有的编程语言都将0视为假。像Lisp及其大部分派生语言、Ruby、Swift等都不会将0视为假。主要是C及其一些其他Algol派生语言、Python和Perl将0视为假。 - abarnert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接