如果使用生成器表达式,为什么Numpy.all()和any()会给出错误的结果?

时间:2013-05-02 09:42:24

标签: python numpy

使用其他人的代码我偶然发现了这个问题。那么numpy行为的解释是什么?

In [1]: import numpy as np

In [2]: foo = [False, False]

In [3]: print np.any(x == True for x in foo)
True  # <- bad numpy!

In [4]: print np.all(x == True for x in foo)
True  # <- bad numpy!

In [5]: print np.all(foo)
False  # <- correct result

P.S。我从这里得到了列表理解码:Check if list contains only item x

1 个答案:

答案 0 :(得分:15)

np.anynp.all不适用于生成器。他们需要序列。当给定非序列时,他们将其视为任何其他对象并在其上调用bool(或执行等效的操作),这将返回True

>>> false = [False]
>>> np.array(x for x in false)
array(<generator object <genexpr> at 0x31193c0>, dtype=object)
>>> bool(x for x in false)
True

列表理解工作虽然:

>>> np.all([x for x in false])
False
>>> np.any([x for x in false])
False

我建议在需要生成器时使用Python的内置anyall,因为它们通常比使用NumPy和列表推导更快(因为双重转换,首先是{{1} },然后到list)。