8

使用其他人的代码时,我偶然发现了这个问题。那么对 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

ps 我从这里得到了列表理解代码:检查列表是否只包含项目 x

4

1 回答 1

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 和列表​​推导式更快(因为双重转换,首先是 to list,然后是 to array)。

于 2013-05-02T10:00:25.563 回答