这是我的问题:
我使用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
答案 0 :(得分:2)
numpy不会将零视为实际值的原因背后的原因是什么?
Python中的一般原则是" falsey"表示False
,None
,数字零*或空集合。有关确切规则,请参阅文档中的Truth Value Testing。**不同的语言对于真实与虚假的***有不同的规则;这些是Python的。
NumPy遵循这个一般原则。因此,零被视为实际值,但它们是实际的 false 值。
因此,一个数字零值的数组没有任何真实的成员,因此在其上调用any
将返回False
。
*请注意,在某些情况下,舍入到0.0
的值并非完全为零,在这种情况下,它可能是令人困惑的。浮动点舍入误差的另一种方法很糟糕...如果您确实需要检查值是否为非零,请检查它们是否在某个适当的epsilon中,而不是检查确切的值。 NumPy在这里有许多有用的助手。
**我遗漏了一个规则,即自定义类型可以通过定义__bool__
方法或依赖于您的确切Python版本的各种回退来决定哪些值是真实的还是虚假的。这就是事情的根深蒂固。但对于这样一个班级的设计师来说,她的班级应该尽量遵循一般原则;无论对她的价值观意味着什么,这些价值都是"零"或"空"或"假"或者"不存在",这是她应用__bool__
方法的规则。
***在C系列语言中,它通常是假的零和NULL指针。在Lisp族语言中,它只是空列表或密切相关的值。在Ruby和Swift中,它只是false
和nil
。等等。在某些情况下,任何规则都会违反直觉;只要语言及其生态系统是一致的,那就像你所希望的一样好。 (如果你必须使用一种不一致的语言,比如PHP或JavaScript,那么你必须保持文档的便利......)
答案 1 :(得分:2)
您实际需要观察的内容:any()
表示"是否有任何元素在此数组中的布尔值为真?"。由于0.
的布尔值为false(非零数字为真),因此当数组仅包含零时,a.any()
为假是正常的。
您可以使用bool()
检查任何Python对象的布尔值。
如果你需要知道你的数组是否有任何元素,那么你可以测试a.size
(0表示没有元素)。