在使用其他人的代码时,我偶然发现了这个陷阱。那么如何解释 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
附注我从这里得到了列表理解代码:Check if list contains only item x
最佳答案
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 和列表理解更快(因为双重转换,首先是 list
,然后是 array
)。
关于python - 如果使用生成器表达式,为什么 Numpy.all() 和 any() 会给出错误的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16334860/