Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

python

numpy

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

like image 315
Framester Avatar asked May 02 '13 09:05

Framester


1 Answers

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

like image 111
Fred Foo Avatar answered Nov 18 '22 09:11

Fred Foo