如何看到numpy数组的零不为空?

时间:2014-08-04 09:36:56

标签: 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不将零视为实际值的原因是什么原因?

我使用的是python 2.6

2 个答案:

答案 0 :(得分:2)

  

numpy不会将零视为实际值的原因背后的原因是什么?

Python中的一般原则是" falsey"表示FalseNone,数字零*或空集合。有关确切规则,请参阅文档中的Truth Value Testing。**不同的语言对于真实与虚假的***有不同的规则;这些是Python的。

NumPy遵循这个一般原则。因此,零被视为实际值,但它们是实际的 false 值。

因此,一个数字零值的数组没有任何真实的成员,因此在其上调用any将返回False


*请注意,在某些情况下,舍入到0.0的值并非完全为零,在这种情况下,它可能是令人困惑的。浮动点舍入误差的另一种方法很糟糕...如果您确实需要检查值是否为非零,请检查它们是否在某个适当的epsilon中,而不是检查确切的值。 NumPy在这里有许多有用的助手。

**我遗漏了一个规则,即自定义类型可以通过定义__bool__方法或依赖于您的确切Python版本的各种回退来决定哪些值是真实的还是虚假的。这就是事情的根深蒂固。但对于这样一个班级的设计师来说,她的班级应该尽量遵循一般原则;无论对她的价值观意味着什么,这些价值都是"零"或"空"或"假"或者"不存在",这是她应用__bool__方法的规则。

***在C系列语言中,它通常是假的零和NULL指针。在Lisp族语言中,它只是空列表或密切相关的值。在Ruby和Swift中,它只是falsenil。等等。在某些情况下,任何规则都会违反直觉;只要语言及其生态系统是一致的,那就像你所希望的一样好。 (如果你必须使用一种不一致的语言,比如PHP或JavaScript,那么你必须保持文档的便利......)

答案 1 :(得分:2)

您实际需要观察的内容:any()表示"是否有任何元素在此数组中的布尔值为真?"。由于0.的布尔值为false(非零数字为真),因此当数组仅包含零时,a.any()为假是正常的。

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

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