numpy都与内置所有不同

时间:2013-01-18 02:24:36

标签: python numpy

numpy all中出现这种奇怪的原因是什么?

>>> import numpy as np
>>> np.all(xrange(10))
False
>>> np.all(i for i in xrange(10))
True

2 个答案:

答案 0 :(得分:7)

Numpy.all不了解生成器表达式。

来自文档

 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.

好的,不是很明确,所以让我们看一下代码

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

由于生成器表达式没有all方法,因此最终调用_wrapit_wrapit中,它首先检查__array_wrap__方法generates AttributeError最终在生成器表达式上调用asarray

来自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.

有关各种类型的输入数据的详细记录,这些输入数据绝对不是生成器表达式

最后,尝试

>>> np.asarray(0 for i in range(10))
array(<generator object <genexpr> at 0x42740828>, dtype=object)

答案 1 :(得分:0)

奇怪。当我尝试时,我得到:

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

嗯。

我不认为numpy understands generator expressions。尝试使用列表理解,你得到这个:

>>> np.all([i for i in xrange(10)])
False