2013-03-12 40 views
11

Mam tablicę Pythona, tak jak:Jak mogę podsumować kolumnę listy?

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

mogę dodać wiersz wykonując sum(array[i]), jak mogę podsumować kolumnę za pomocą podwójnej pętli for?

I.E. dla pierwszej kolumny, mogę dostać 2, potem 4, potem 6.

+1

rozważyć przeniesienie do NumPy ndarrays dla ładniejsze cięcie (w twoim przypadku byłaby to "a [:, i] .sum()" – wim

Odpowiedz

6

Nie trzeba pętlę, należy zip() transpozycji listę, a następnie podjąć żądaną kolumnę:

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

(Uwaga w 2.x, zip() zwraca listę, więc nie potrzebujesz połączenia list()).

Edit: Najprostszym rozwiązaniem tego problemu, bez użycia zip(), będzie prawdopodobnie:

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

Właśnie pętli wierszy, biorąc elementu i dodanie go do naszego sumie.

Jest to jednak mniej wydajne i raczej bezsensowne, ponieważ mamy wbudowane funkcje, które umożliwiają nam to. Zasadniczo użyj zip().

+0

Widziałem to w innej odpowiedzi, ale chcę wiedzieć, jak to zrobić w ten sposób, zanim nauczę się, jak zrobić to bardziej efektywnie . – MarJamRob

+1

@MarJamRob Zobacz moją edycję. –

+0

Tymczasowa transpozycja całej macierzy w celu zsumowania jednego z wynikowych wierszy nie wydaje mi się zbyt skuteczna ... ani też nie używa wbudowanej funkcji 'sum()' (w kodzie w edycji). – martineau

0

można użyć zip():

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

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

lub prosty dla pętli:

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]))] 

To powinno wystarczyć. len(array[0]) to liczba kolumn, więc i iteruje za ich pośrednictwem. Wyrażenie generatora row[i] for row in array przechodzi przez wszystkie wiersze i wybiera pojedynczą kolumnę dla każdego numeru kolumny.

0

Możesz być zainteresowany numpy, który ma więcej zaawansowanych funkcji tablicowych. Jednym z nich jest łatwo podsumować kolumnę:

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

Myślę, że twoja odpowiedź jest błędna. Prawdopodobnie miałeś na myśli a.sum (column_idx), ale nawet to byłoby błędne, ponieważ aby uzyskać sumę po kolumnie jako OP, potrzebowałbyś column_idx = 0 –

2

Myślę, że najprostszym sposobem jest taka:

sumcolumn=data.sum(axis=0) 

print (sumcolumn) 
+0

Wygląda na to, że ta odpowiedź zakłada numpy, ale poprawia się druga numpy odpowiedź. Może pomóc innym, jeśli wypełnisz ten przykład kodu. – abathur

+0

Witaj w SO. Przeczytaj ten [jak-odpowiedź] (http://stackoverflow.com/help/how-to-answer) i postępuj zgodnie ze wskazówkami w celu zapewnienia wysokiej jakości odpowiedzi. – thewaywewere

0

Można użyć numpy:

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