2016-09-25 13 views
1

我想計算一個矩陣中兩列的總和(列0和列1之間的總和,列在2和3之間......)。每兩列的加法

所以我試圖做嵌套的「for」循環,但每次我都沒有好的結果。

例如:

c = np.array([[0,0,0.25,0.5],[0,0.5,0.25,0],[0.5,0,0,0]],float) 
freq=np.zeros(6,float).reshape((3, 2)) 

#I calculate the sum between the first and second column, and between the fird and the fourth column 
for i in range(0,4,2): 
    for j in range(1,4,2): 
     for p in range(0,2): 
      freq[:,p]=(c[:,i]+c[:,j]) 

但結果是:

print freq   
array([[ 0.75, 0.75], 
     [ 0.25, 0.25], 
     [ 0. , 0. ]]) 

Normaly良好結果必須是(0,0.5,0.5)和(0.75,0.25,0)。所以我認爲問題出在嵌套的「for」循環中。

有沒有人知道我可以計算每兩列的總和,因爲我有一個有400列的矩陣?

回答

2

下面是使用np.split()一個辦法:

In [36]: np.array(np.split(c, np.arange(2, c.shape[1], 2), axis=1)).sum(axis=-1) 
Out[36]: 
array([[ 0. , 0.5 , 0.5 ], 
     [ 0.75, 0.25, 0. ]]) 

或者因爲即使奇數長數組更通用方式:

In [87]: def vertical_adder(array): 
      return np.column_stack([np.sum(arr, axis=1) for arr in np.array_split(array, np.arange(2, array.shape[1], 2), axis=1)]) 
    ....: 

In [88]: vertical_adder(c) 
Out[88]: 
array([[ 0. , 0.75], 
     [ 0.5 , 0.25], 
     [ 0.5 , 0. ]]) 

In [94]: a 
Out[94]: 
array([[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14]]) 

In [95]: vertical_adder(a) 
Out[95]: 
array([[ 1, 5, 4], 
     [11, 15, 9], 
     [21, 25, 14]]) 
+0

很好的回答。小點:爲了適應OP的尺寸,最後加上'.T',不是? –

+0

@AmiTavory的確,感謝您的留言。 – Kasramvd

3

你可以簡單地重塑到最後一個維度分爲兩個層面,與最後維度的長度爲2,然後相加,就像這樣 -

freq = c.reshape(c.shape[0],-1,2).sum(2).T 

整形只會在數組中創建一個視圖,所以我們只是在這裏使用求和操作,因此必須高效。

採樣運行 -

In [17]: c 
Out[17]: 
array([[ 0. , 0. , 0.25, 0.5 ], 
     [ 0. , 0.5 , 0.25, 0. ], 
     [ 0.5 , 0. , 0. , 0. ]]) 

In [18]: c.reshape(c.shape[0],-1,2).sum(2).T 
Out[18]: 
array([[ 0. , 0.5 , 0.5 ], 
     [ 0.75, 0.25, 0. ]]) 
+0

非常好。非常非常小的一點:爲什麼'.T'在最後?從OP的問題看,它的尺寸應該是3 X 2,不是? –

+0

@AmiTavory是的,我不太確定OP所需的o/p格式,但是由於OP提到:'「(0.,0.5,0.5)和(0.75,0.25,0)」',我認爲這些是被設置成行。 – Divakar

3

添加切片c[:, ::2]c[:, 1::2]

In [62]: c 
Out[62]: 
array([[ 0. , 0. , 0.25, 0.5 ], 
     [ 0. , 0.5 , 0.25, 0. ], 
     [ 0.5 , 0. , 0. , 0. ]]) 

In [63]: c[:, ::2] + c[:, 1::2] 
Out[63]: 
array([[ 0. , 0.75], 
     [ 0.5 , 0.25], 
     [ 0.5 , 0. ]]) 
+0

非常優雅,深思熟慮! – Divakar

+0

好主意。即使沒有numpy巫術,它也是有意義的。 –