2015-08-08 76 views
0

給定一個numpy矩陣,我正在創建一個新的矩陣,它由從起始矩陣的列計算出的列組成。我可以用矢量操作做到這一點,但它不是很優雅。舉個例子,假設我想計算簡單的增長率。最優雅的計算numpy矩陣中的許多列?

開始矩陣:

m = np.matrix(np.random.random_integers(1,100, size=(5,3))) 
matrix([[ 96, 61, 100], 
     [ 18, 82, 17], 
     [ 59, 35, 58], 
     [ 26, 97, 95], 
     [ 25, 49, 32]]) 

期望中的計算矩陣G:

g0 = np.empty((5, 1)) 
g0[:] = np.nan 
g1 = (m[:, 1] - m[:, 0])/m[:, 0] 
g2 = (m[:, 2] - m[:, 1])/m[:, 1] 
g = np.hstack((g0, g1, g2)) 
matrix([[  nan, -0.36458333, 0.63934426], 
     [  nan, 3.55555556, -0.79268293], 
     [  nan, -0.40677966, 0.65714286], 
     [  nan, 2.73076923, -0.02061856], 
     [  nan, 0.96  , -0.34693878]]) 

我處理真正的M矩陣包含許多列。

回答

1

對於這個特定的問題,你可以計算一個步驟:

>>> (m[:,1:]- m[:,:-1])/m[:,:-1] 
array([[-0.36458333, 0.63934426], 
     [ 3.55555556, -0.79268293], 
     [-0.40677966, 0.65714286], 
     [ 2.73076923, -0.02061856], 
     [ 0.96  , -0.34693878]]) 

>>> np.diff(m,1)/m[:,:-1] 
array([[-0.36458333, 0.63934426], 
     [ 3.55555556, -0.79268293], 
     [-0.40677966, 0.65714286], 
     [ 2.73076923, -0.02061856], 
     [ 0.96  , -0.34693878]]) 

,然後如果你堅持,你可以添加NaN的一種柱。 (另外:請注意,我使用的是數組而不是矩陣,因爲它們通常更方便,但上面也會使用矩陣。)

即使操作不能如此輕鬆地進行矢量化 - 假設列計算之間存在依賴關係 - 只要列的數量與行數相比較小,您也可以手動執行循環。在最小維度上進行循環並將剩餘部分的計算向量化是一種常見的折中方案。

+0

這正是我一直在尋找的。謝謝! – user2962397