2013-03-12 3 views
11

У меня есть массив Python, например, так:Как я могу суммировать столбец списка?

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

Я могу добавить строку, выполнив sum(array[i]), как я могу суммировать столбец, используя двойной цикл?

I.E. для первого столбца, я мог бы получить 2, затем 4, затем 6.

+1

рассмотреть вопрос о переходе к Numpy ndarrays для (это будет 'a [:, i] .sum()' в вашем случае) – wim

ответ

6

Вам не нужен цикл, используйте zip() транспонировать список, а затем взять нужный столбец:

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

(Примечание в 2.x, zip() возвращает список, так что вам не нужен звонок list()).

Edit: Самое простое решение этой проблемы, без использования zip(), вероятно, будет:

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

Мы просто цикл по строкам, принимая элемент и добавить его в нашем общем.

Это, однако, менее эффективно и довольно бессмысленно, поскольку у нас есть встроенные функции для этого. В общем, используйте zip().

+0

Я видел это по другому ответу, но я хочу знать, как это сделать, прежде чем научиться делать это более эффективно , – MarJamRob

+1

@MarJamRob Смотрите мое редактирование. –

+0

Временная перенос всей матрицы для суммирования одной из результирующих строк для меня не очень эффективна ... и не использует встроенную функцию 'sum()' для нее (в коде в редакции). – martineau

0

вы можете использовать zip():

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

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

или просто для петель:

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 спросил, что вам понадобится column_idx = 0 –

2

Я думаю, самый простой способ заключается в следующем:

sumcolumn=data.sum(axis=0) 

print (sumcolumn) 
+0

Похоже, этот ответ предполагает numpy, но улучшает другой ответ numput. Это может помочь другим, если вы заполните этот пример кода – abathur

+0

Добро пожаловать в SO. Пожалуйста, прочитайте это [как-ответ] (http://stackoverflow.com/help/how-to-answer) и следуйте инструкциям, чтобы предоставить качественный ответ. – thewaywewere

0

Вы можете использовать NumPy:

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