numpy argmax没有从生成器表达式中获取所有值

时间:2016-06-28 06:28:16

标签: numpy generator

以下

的输出
import numpy as np
print(np.argmax([i for i in range(0, 10)]))
print(np.argmax(i for i in range(0, 10)))

9
0

为什么argmax只减少一次生成器表达式?

2 个答案:

答案 0 :(得分:2)

由于我没有要求的声望金额,我正在添加这个答案。

正如@hpaulj所建议的那样,np.argmax在numeric.py中调用asarray函数。这里开发人员在代码中提到了这一点:

def 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.

...

因此您的a与要求不符。同样为什么输入返回零。该返回值来自函数

result = getattr(asarray(obj), method)(*args, **kwds)
首先调用fromnumeric.py中的

。对于生成器对象,代码无法解析方法,此函数可能会返回0作为默认值

这是我对该问题的研究

答案 1 :(得分:1)

比较这两个表达式:

# sed arguments in an array
sedArgs=(-e 's/search1/replace1/g' -e 's/search2/replace2/g' -e 's/search3/replace3/g')

# then use it as    
sed "${sedArgs[@]}" file
应用于列表的

In [682]: np.asarray([i for i in range(3)]) Out[682]: array([0, 1, 2]) In [683]: np.asarray(i for i in range(3)) Out[683]: array(<generator object <genexpr> at 0xb367bb9c>, dtype=object) (或asarray)会生成一个带数字的数组。应用于生成器的同样的事情产生一个array数组,其中包含1个项目,即生成器本身。实际上它的形状是dtype=object(0d)。您可以使用()

恢复此生成器

np.array(i for i in range(3))[()]可以迭代生成器,但fromiter只迭代列表和元组之类的东西。

array

In [688]: np.fromiter((i for i in range(3)),int) Out[688]: array([0, 1, 2]) 取决于它的输入是一个数组。