numpy all differing from builtin all

匿名 (未验证) 提交于 2019-12-03 02:14:01

问题:

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 

回答1:

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) 


回答2:

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 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!