2016-06-28 45 views
1

讓所有值以下numpy的argmax不是從發電機表達

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降低只有一次發電機體現在哪裏?

+0

'np.array(I for I ...)'做了什麼?許多numpy函數都使用它,或者'np.asarray'來確保它們與數組一起工作。 – hpaulj

回答

1

研究比較這兩種表情:

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)應用於列表會生成一個包含數字的數組。同樣的東西應用於發電機產生一個dtype=object數組與1項,發電機本身。實際上它的形狀是()(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]) 

argmax取決於其輸入是一個數組。

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

...

因此你的一個不符合要求。此外爲什麼零返回任何輸入。該返回值來自函數

result = getattr(asarray(obj), method)(*args, **kwds) 

in fromnumeric.py首先被調用。作爲一個發電機對象的代碼無法解析方法,這個功能可能返回0作爲默認

這是我關於這個問題