2016-07-23 49 views
0

我不知道你是否可以定義一個函數同時作用於一維numpy數組的所有元素,這樣你就不必遍歷數組。例如,類似於您可以將數組的所有元素放在一起而不循環。的我後的一個例子是將這段代碼:作用於numpy數組的所有元素的函數?

A = np.array([ [1,4,2], [5,1,8], [2,9,5], [3,6,6] ]) 
B = [] 

for i in A: 
    B.append(i[0] + i[1] - i[2]) 

B = array(B) 
print B 

輸出:

>>> array([3, -2, 6, 3]) 

的東西,如:

A = np.array([ [1,4,2], [5,1,8], [2,9,5], [3,6,6] ]) 

def F(Z): 
    return Z[0] + Z[1] - Z[2] 

print F(A) 

使輸出是一樣的東西:

>>> array([ [3] , [-2], [6], [3] ]) 

我知道第二個代碼w不會產生我所追求的,但我只是想說出我在說什麼。謝謝!

編輯:

我用上面的函數只是一個簡單的例子。我想用真正的功能是這樣的:

from numpy import linalg as LA 

def F(Z): 
    #Z is an array of matrices 
    return LA.eigh(Z)[0] 

所以我有3×3矩陣陣列,我想他們的特徵值的輸出數組。我想知道是否有可能以某種numpythonic的方式做到這一點,以便不必遍歷數組。

+0

切片可能會有所幫助:http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#basic-slicing-and-indexing – Divakar

+3

'B = A [:,0] + A [:, 1] - A [:, 2]'? (假設你的意思是'我[2]'而不是'[2]')或者你可以使用'np.dot':你實質上是在這裏做一個矩陣一矢量乘法。 –

+1

'numpy'已經定義了一組基本的函數,這些函數對一個或多個數組的所有元素進行操作。有效的'numpy'代碼結合了這些功能。把它想象成一堆「平行」的積木。在「串行」思考之前嘗試使用它們(循環遍歷「標量」函數)。 – hpaulj

回答

3

嘗試:

np.apply_along_axis(F, 1, A) 
+2

然而,在這種特殊情況下,這是不必要的低效率,因爲在'apply_along_axis'的實現中涉及到Python級''for'循環。 (呃,實際上,這是一個'while'循環,但它也是一樣。)簡單的切片解決方案可能會更好。 –

+0

是的,這是事實。我只是跑了一些測試,這個解決方案不能比for循環更快。這絕對是一種更有效的編寫代碼的方式,但它並沒有減少計算效率,這是我的目標。我認爲切片可能是要走的路。感謝大家的回覆。 – cracka31

相關問題