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
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
).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With