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

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