2013-03-03 73 views
2

如何優化涉及numpy數組的函數?函數和numpy數組預分配

使用案例:

def create_array_and_fill(a, b, N): 
    res = np.zeros(N, N) 

    res[0] = a 
    res[-1] = b 

    return res 

c = create_array_and_fill(5, 9, 100) 

不過,有時候,我事先知道,我需要使用(比如用於測試目的)的所有陣列的最大尺寸,有啥最好的方法?我應該預先分配嗎?最好的辦法是什麼?例如,我可以將一個預分配的數組傳遞給一個函數,以便該函數只是更新它而不是返回一個新的數組?

我的第一個想法如下,但當然,它帶有成本,我現在必須改變我所有的功能簽名。

def create_array_and_fill(a, b, N, res): 

    res[0] = a 
    res[-1] = b 

    # No more return here? 

c = np.zeros(N, N) 
create_array_and_fill(a, b, N, c) 
+2

這取決於功能。如果該函數設置爲允許傳遞預分配數組,則可以將預分配數組傳遞給函數。您需要更具體才能獲得更具體的答案。 – BrenBarn 2013-03-03 01:06:51

+0

如果需要,我可以更改函數簽名,但我該怎麼做? – 2013-03-03 01:39:28

回答

2

如果我理解你的要求,你可以做這樣的事情:

def fill_array(a, b, N, out=None): 
    if out is None: 
     out = np.zeros(N, N) 
    out[0] = a 
    out[-1] = b 
    return out 

這會修改out對象,如果提供一個,或返回一個新的,如果沒有提供out 。在這種情況下,即使修改現有值,它仍然會返回該值,但如果提供了explit; icit out,您可以輕鬆修改它以返回None。

但是,如果您希望它們以任一方式工作(使用給定「out」數組或創建新數組),您將不得不更改函數。如果你在一個創建一個新數組的函數中編寫代碼,那麼沒有什麼不可思議的方法可以使它不會僅僅因爲你有另一個預先創建的數組而執行該代碼。你必須編輯你的功能。