Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

numpy all differing from builtin all

Tags:

python

numpy

What is the reason for this weirdness in numpy's all?

>>> import numpy as np
>>> np.all(xrange(10))
False
>>> np.all(i for i in xrange(10))
True
like image 690
wim Avatar asked Jan 18 '13 02:01

wim


1 Answers

Numpy.all does not understands generator expressions.

From the documentation

 numpy.all(a, axis=None, out=None)

    Test whether all array elements along a given axis evaluate to True.
    Parameters :    

    a : array_like

        Input array or object that can be converted to an array.

Ok, not very explicit, so lets look at the code

def all(a,axis=None, out=None):
    try:
        all = a.all
    except AttributeError:
        return _wrapit(a, 'all', axis, out)
    return all(axis, out)

def _wrapit(obj, method, *args, **kwds):
    try:
        wrap = obj.__array_wrap__
    except AttributeError:
        wrap = None
    result = getattr(asarray(obj),method)(*args, **kwds)
    if wrap:
        if not isinstance(result, mu.ndarray):
            result = asarray(result)
        result = wrap(result)
    return result

As generator expression doesn't have all method, it ends up calling _wrapit In _wrapit, it first checks for __array_wrap__ method which generates AttributeError finally ending up calling asarray on the generator expression

From the documentation of numpy.asarray

 numpy.asarray(a, dtype=None, order=None)

    Convert the input to an array.
    Parameters :    

    a : array_like

        Input data, in any form that can be converted to an array. This includes lists, lists of tuples, tuples, tuples of tuples, tuples of lists and ndarrays.

It is well documented about the various types of Input data thats accepted which is definitely not generator expression

Finally, trying

>>> np.asarray(0 for i in range(10))
array(<generator object <genexpr> at 0x42740828>, dtype=object)
like image 156
Abhijit Avatar answered Nov 13 '22 05:11

Abhijit