Why do Numpy.all() and any() give wrong results if you use generator expressions?
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
).