numpy all differing from builtin all

后端 未结 2 568
迷失自我
迷失自我 2020-12-07 01:50

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

>>> import numpy as np
>>> np.all(xrange(10))
False
>>> np.all         


        
相关标签:
2条回答
  • 2020-12-07 02:28

    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)
    
    0 讨论(0)
  • 2020-12-07 02:45

    Strange. When I try that I get:

    >>> np.all(i for i in xrange(10))
    <generator object <genexpr> at 0x7f6e04c64500>
    

    Hmm.

    I don't think numpy understands generator expressions. Try using a list comprehension and you get this:

    >>> np.all([i for i in xrange(10)])
    False
    
    0 讨论(0)
提交回复
热议问题