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

Fra*_*ter 8 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
Run Code Online (Sandbox Code Playgroud)

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

Fre*_*Foo 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
Run Code Online (Sandbox Code Playgroud)

列表推导工作,但:

>>> np.all([x for x in false])
False
>>> np.any([x for x in false])
False
Run Code Online (Sandbox Code Playgroud)

我建议使用Python的内置anyall预期发电机时,因为它们通常速度比使用与NumPy和列表理解(因为双转换,先list,然后去array).

  • @KarolyHorvath:`array`文档字符串拼写出来:"一个数组,任何暴露数组接口的对象,一个`__array__`方法返回一个数组的对象,或者任何(嵌套的)序列." 这是整个NumPy中使用的"类似阵列"的定义.不幸的是,任何*other*对象都被转换为0-d数组(尝试`np.array("foo").shape`). (4认同)