Why do Numpy.all() and any() give wrong results if you use generator expressions?

numpy, python

Solution

`np.any` and `np.all` don't work on generators. They need sequences. When given a non-sequence, they treat this as any other object and call `bool` on it (or do something equivalent), which will return `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

List comprehensions work, though:

>>> np.all([x for x in false])
False
>>> np.any([x for x in false])
False

I advise using Python's built-in `any` and `all` when generators are expected, since they are typically faster than using NumPy and list comprehensions (because of a double conversion, first to `list`, then to `array`).

Problem

Working with somebody else's code I stumbled across this gotcha. So what is the explanation for numpy's behavior? ``` 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 ``` p.s. I got the list comprehension code from here: Check if list contains only item x

Original source

Related problems