2013-03-12 46 views
11

我有一個Python陣列,像這樣:如何求和一列列表?

[[1,2,3], 
[1,2,3]] 

我可以做sum(array[i])添加行,我怎麼可以總結列,使用雙for循環?

I.E.對於第一列,我能得到2,然後是4,那麼6

+1

考慮遷移到NumPy的ndarrays爲更好的切片(在你的情況下,它會是'a [:,i] .sum()') – wim 2013-03-12 03:02:20

回答

6

你並不需要一個循環,使用zip()移調列表,然後取所需的列:

sum(list(zip(*data)[i])) 

(注在2.x中,zip()返回一個列表,所以你不需要調用list())。

編輯:這個問題的簡單的解決方案,而無需使用zip(),很可能是:

column_sum = 0 
for row in data: 
    column_sum += row[i] 

我們只是通過行循環,取元素,並將其加入到我們總。

然而,由於我們有內置的功能可以爲我們做到這一點,因此效率較低,而且毫無意義。一般來說,使用zip()

+0

我在另一個答案中看到了,但我想知道如何做到這一點,然後才學習如何更有效地做到這一點。 – MarJamRob 2013-03-12 02:54:12

+1

@MarJamRob看我的編輯。 – 2013-03-12 02:57:24

+0

暫時轉移整個矩陣以合計其中一個結果行似乎對我來說效率並不高......也不使用內置的sum()函數來完成它(在編輯中的代碼中)。 – martineau 2015-12-05 00:04:30

0

您可以使用zip()

In [16]: lis=[[1,2,3], 
    ....: [1,2,3]] 

In [17]: map(sum,zip(*lis)) 
Out[17]: [2, 4, 6] 

或用一個簡單的for循環:

In [25]: for i in xrange(len(lis[0])): 
    summ=0 
    for x in lis: 
     summ+=x[i] 
    print summ 
    ....:  
2 
4 
6 
3
[sum(row[i] for row in array) for i in range(len(array[0]))] 

應該這樣做。 len(array[0])是列數,所以i迭代通過那些。生成器表達式row[i] for row in array遍歷所有行併爲每個列號選擇一個列。

0

您可以在numpy感興趣,它具有更高級陣列功能。 其中之一是容易總結列:

from numpy import array 

a = array([[1,2,3], 
[1,2,3]]) 

column_idx = 1 
a[:, column_idx].sum() # ":" here refers to the whole array, no filtering. 
+0

我認爲你的回答是錯誤的。你可能意味着a.sum(column_idx),但即使這也是錯誤的,因爲爲了得到OP列的總和,因爲OP問你需要column_idx = 0 – 2016-08-05 20:14:51

2

我認爲最簡單的方法是這樣的:

sumcolumn=data.sum(axis=0) 

print (sumcolumn) 
+0

它看起來像這個答案假設numpy,但確實改善另一個numpy答案。如果您填寫此代碼示例,它可以幫助其他人 – abathur 2017-05-06 16:51:35

+0

歡迎來到SO。請閱讀[如何解答](http://stackoverflow.com/help/how-to-answer),並按照指南提供優質的答案。 – thewaywewere 2017-05-06 16:58:10

0

您可以使用numpy的:

import numpy as np 
a = np.array([[1,2,3],[1,2,3]]) 
a.sum(0)