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

发布于 2021-01-29 17:32:16

与其他人的代码一起工作时,我偶然发现了这个陷阱。那么,对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
关注者
0
被浏览
49
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    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)。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看