[Numpy-discussion] Bug in numpy all() function

Robert Kern robert.kern@gmail....
Wed Feb 6 14:03:20 CST 2008


Dan Goodman wrote:
> Hi all,
> 
> I think this is a bug (I'm running Numpy 1.0.3.1):
> 
>>>> from numpy import *
>>>> def f(x): return False
> 
>>>> all(f(x) for x in range(10))
> True
> 
> I guess the all function doesn't know about generators?

Yup. It works on arrays and things it can turn into arrays by calling the C API 
equivalent of numpy.asarray(). There's a ton of magic and special cases in 
asarray() in order to interpret nested Python sequences as arrays. That magic 
works fairly well when we have sequences with known lengths; it fails utterly 
when given an arbitrary iterator of unknown length. So we punt. Unfortunately, 
what happens then is that asarray() sees an object that it can't interpret as a 
sequence to turn into a real array, so it makes a rank-0 array with the iterator 
object as the value. This evaluates to True.

It's possible that asarray() should raise an exception for generators, but it 
would be a special case. We wouldn't be able to test for arbitrary iterables.

-- 
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
  that is made terrible by our own mad attempt to interpret it as though it had
  an underlying truth."
   -- Umberto Eco


More information about the Numpy-discussion mailing list