Python 如何看到一个由零组成的numpy数组不是空的?

Python 如何看到一个由零组成的numpy数组不是空的?,python,numpy,Python,Numpy,我的问题是: 我使用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不将零视为实际值的原因是什么 我使用Python2.6 numpy不将零视为实际值的原因是什么 Python中的一般原则是,“False”表

我的问题是:

我使用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不将零视为实际值的原因是什么

我使用Python2.6

numpy不将零视为实际值的原因是什么

Python中的一般原则是,“False”表示
False
None
、数字零*、或空集合。请参阅文档中的确切规则。**不同的语言对于什么是truthy和falsy有不同的规则***;这些是Python的

NumPy遵循这一一般原则。所以,零被认为是实际值,但它们是实际的假值

因此,一个充满数值零值的数组没有任何truthy成员,因此对其调用
any
将返回
False


*请注意,在某些情况下,舍入到
0.0
的值并不完全为零,在这种情况下,可能会令人困惑地为真。如果你真的需要检查这些值是否非零,检查它们是否在零的适当ε范围内,而不是检查精确值。NumPy在这里有很多有用的助手

**我忽略了一条规则,即自定义类型可以通过定义
\uuuubool\uuuu
方法或各种依赖于确切Python版本的回退来决定哪些值是真的还是假的。这就是引擎盖下的工作原理。但对于这样一个班级的设计者来说,她的班级应该尽量遵循一般原则;无论对她的值“零”或“空”或“假”或“不存在”意味着什么,这都是她的
\uuuuu bool\uuuu
方法应该应用的规则


***在C族语言中,通常零和空指针是错误的。在Lisp族语言中,它只是空列表或密切相关的值。在Ruby和Swift中,它只是
false
nil
。等等在某些情况下,任何规则都会违反直觉;只要语言和它的生态系统是一致的,这就是你所希望的。(如果您必须使用不一致的语言,如PHP或JavaScript,则必须将文档放在手边……

您实际观察到的是:
any()
表示“此数组中是否有布尔值为真的元素?”。由于
0.
的布尔值为false(非零数字为true),因此当数组仅包含零时,
a.any()
为false是正常的

您可以使用
bool()
检查任何Python对象的布尔值


如果您需要知道数组是否有任何元素,那么您可以测试
a.size
(0表示没有元素)。

它们被视为“实际值”,它们只是计算
False
@jornsharpe:小心;实际上,它们的计算结果不是
False
,但它们的计算结果是False值。这就是为什么社区使用“真实”和“虚假”来避免这种混淆。好吧,这是为了顽固地提醒大家,Python社区中有人在该死的斯蒂芬·科尔伯特(Stephen Colbert)之前提出了“真实性”。)@谢谢,说得不好。我不知道。对我来说,浮点值返回为False似乎是违反直觉的(特别是在数组的情况下,在这种情况下,很可能得到零作为结果),但如果是这样的话,就足够公平了@WilliamAbma:每种语言都有自己的真实性规则,你提出的每一条规则在某些情况下都会违反直觉,但在其他情况下则不然;只要一种语言(以及它的stdlib和流行的第三方库)是一致的,这就是你所能要求的一切。@EOL:并非所有语言都是一致的。Lisp及其大多数衍生工具Ruby、Swift等不会将0视为false。主要是C派生(以及其他一些Algol派生)语言、Python和Perl将
0
视为false。