使用其他人的代码我偶然发现了这个问题。那么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
答案 0 :(得分:15)
np.any
和np.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的内置any
和all
,因为它们通常比使用NumPy和列表推导更快(因为双重转换,首先是{{1} },然后到list
)。