2015-01-31 89 views
0

通常灌裝一個numpy的陣列,函數的總和將被這樣在python使用任意的函數

fsum = 0 
for k in range(1, N+1): 
    fsum += f(k) 

哪裏f是一些函數來完成。

使用numpy的整點是vectorize everything。在這種情況下,對於非常大的N,循環將會很慢。如何使用numpy填充numpy array使用函數f(可能需要多個參數)?

+3

你的例子不適合標題。你沒有填充數組,你正在一個簡單的值範圍內求和一個函數。在'numpy'中,通過使用快速編譯代碼的函數來表達問題,從而「矢量化」。 – hpaulj 2015-01-31 18:17:12

+0

@hpaulj謝謝指出(+1)。我的(不正確的)假設是我可以通過做這樣的事情來填充'numpy'數組:'narray = np.array(f,range)'。對於任何在相同假設條件下犯此錯誤的人,我都會留下標題。 – Samaursa 2015-01-31 18:57:46

回答

4

首先,我已經擴大你的代碼,以實際執行它,包括選擇一個特定的F(K)所需的最小:

import numpy as np 

def f(k): 
    return(np.log(k**2)) 

N=8 
fsum = 0 
for k in range(1, N+1): 
    fsum += f(k) 

print fsum 

其中給出和21.209的答案。現在讓我們做同樣的事情,但矢量化。注意函數f(k)是相同的。

import numpy as np 

def f(k): 
    return(np.log(k**2)) 

N=8 
k = np.array(range(1, N+1)) 
print np.sum(f(k)) 

這給出了相同的答案。關鍵的區別在於我定義了一個numpy數組來包含您在for循環中迭代的輸入。那就是:

k = np.array(range(1, N+1)) 

其中,如果您想更有效,可以簡化爲:

k = np.arange(1, N+1) 

因爲f(K)已寫入使用numpy的數學函數的時候,已經向量化。然後,而不是使用含+ =操作的循環,我代替F上的numpy.sum矢量函數(K):

print np.sum(f(k)) 

正如可以看到的結果是更簡潔,對於大型陣列它將也要快得多。

+1

好點!我會更新答案。 – ZSG 2015-01-31 18:40:13

+0

比我給出的鏈接中的答案好得多的解釋。謝謝! – Samaursa 2015-01-31 18:58:25