2016-07-25 102 views
0

我想在參數tiling向量化以下功能:蟒蛇functools.partial值的參數

def find_tile(x,tiling): 
    """ 
    Calculates the index of the closest element of 'tiling' to 'x'. 
    tiling: array of grid positions 
    x: variable of the same type as the elements of tiling 
    """ 
    return np.argmin(np.linalg.norm(tiling - x, axis=1)) 

例如,函數的非量化版本可以接受以下參數

tiling = np.array([[i,j] for i in xrange(3) for j in xrange(3)]) 
x = np.array([1.2, 2.7]) 

我很感興趣,找到最快的矢量化,這樣x仍然是一個單一的載體,我可以傳遞參數列表tiling

所以我試圖用一臺發電機定義多個瓦塊:

tilings = (tiling + np.random.uniform(0,1,2) for j in xrange(3)) 

,然後使用mapfunctools.partial

map(functools.partial(find_tile, x=x), tilings) 

顯然,有一個與x是一個數組或東西的問題,因爲我得到的錯誤:

Traceback (most recent call last): 
    File "main.py", line 43, in <module> 
    inds = map(functools.partial(find_tile, x=x), ts) 
TypeError: find_tile() got multiple values for keyword argument 'x' 

有人可以向我解釋如何ge在它周圍嗎?

此外,有沒有另一種更快的方式做到這一點(可能重寫的功能find_tile?)

回答

1

您傳遞x作爲關鍵字參數map()作爲位置自變量傳遞來自tilings的每個元素。但是,由於您的第一個位置參數是x,因此與關鍵字參數衝突。使用名稱作爲關鍵字參數不會阻止相同名稱被位置參數填充。

請勿使用關鍵字參數x;只是通過它作爲一個位置參數來partial()

map(functools.partial(find_tile, x), tilings) 

現在從tilings每個元素傳遞中作爲第二個位置參數和呼叫的作品。