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

标签 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

附注我从这里得到了列表理解代码:Check if list contains only item x

最佳答案

np.anynp.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 的内置 anyall,因为它们通常比使用 NumPy 和列表​​理解更快(因为双重转换,首先是 list,然后是 array)。

关于python - 如果使用生成器表达式,为什么 Numpy.all() 和 any() 会给出错误的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16334860/

相关文章:

python - 从列表中删除相邻的重复元素

python - 大数组之间的 numpy bool 比较返回 False 而不是 bool 数组

python - numpy strides 只能在子数组内跨步吗?

python - scikit 索引越界

python - 使用线程时的套接字问题

python - argparse 允许任意标志

python - 从 numpy 撤消 pretty-print

python - Django 中最简洁的方法是在数据库中制作对象的修改副本

python - PyTorch 张量的加权平均值

python - 如何计算一个值在数组中出现了多少次