2016-07-26 145 views
1

說我有一個函數foo(),它接受一個浮點數並返回一個浮點數。將此函數應用於numpy矩陣或數組中的每個元素的最快/最蟒蛇方法是什麼?如何對numpy矩陣中的每個元素執行操作?

我本質上需要的是這個代碼的版本,不使用循環:

import numpy as np 

big_matrix = np.matrix(np.ones((1000, 1000))) 

for i in xrange(np.shape(big_matrix)[0]): 

    for j in xrange(np.shape(big_matrix)[1]): 

     big_matrix[i, j] = foo(big_matrix[i, j]) 

我試圖找到numpy的文檔中的東西,讓我做到這一點,但我的天堂」什麼都沒發現。

編輯:正如我在評論中所提到的,特別是我需要使用的功能是雙曲線函數,f(z) = 1/(1 + exp(-z))

+0

同意矢量化是答案。您將需要重新考慮foo()所做的功能,目前它適用於單個元素。矢量化意味着一次對整個行/列進行操作,從而消除循環。 –

+1

'np.vectorize'絕對是一般情況下最「pythonic」的。然而,對於某些函數'foo',通過完全不使用函數並依賴'numpy'向量操作,你可能會做得更好(因爲'np.vectorize'實際上沒有做任何事情來使得計算更高性能)。 – mgilson

+0

我專門希望使用S形函數,即'F(z)的= 1 /(1 + EXP(-z))' –

回答

3

如果foo確實是一個黑盒子,需要一個標量,並返回一個標量,那麼你必須使用某種形式的迭代。人們經常嘗試np.vectorize,並認識到,正如文件所述,它不會加快速度。作爲廣播多個輸入的方式,它是最有價值的。它使用np.frompyfunc,它稍微快一點,但有一個不太方便的界面。

正確numpy的辦法是改變你的功能,所以它與陣列工作。這應該不難與您的意見功能

f(z) = 1/(1 + exp(-z)) 

有一個np.exp函數。其餘的都是簡單的數學。

+0

接受,因爲它回答我的實際問題。我改變了我的問題來反映這一點。 –

相關問題