【发布时间】:2013-03-12 02:51:43
【问题描述】:
我有一个 Python 数组,如下所示:
[[1,2,3],
[1,2,3]]
我可以通过 sum(array[i]) 添加行,如何使用双 for 循环对列求和?
I.E.对于第一列,我可以得到 2,然后是 4,然后是 6。
【问题讨论】:
-
考虑转移到 numpy ndarrays 以获得更好的切片(在你的情况下是
a[:,i].sum())
我有一个 Python 数组,如下所示:
[[1,2,3],
[1,2,3]]
我可以通过 sum(array[i]) 添加行,如何使用双 for 循环对列求和?
I.E.对于第一列,我可以得到 2,然后是 4,然后是 6。
【问题讨论】:
a[:,i].sum())
使用for 循环(在generator expression 中):
data = [[1,2,3],
[1,2,3]]
column = 1
print(sum(row[column] for row in data)) # -> 4
【讨论】:
【讨论】:
你不需要循环,使用zip()转置列表,然后取所需的列:
sum(list(zip(*data)[i]))
(注意在 2.x 中,zip() 返回一个列表,因此您不需要 list() 调用)。
编辑:不使用zip() 的最简单解决方案可能是:
column_sum = 0
for row in data:
column_sum += row[i]
我们只是遍历行,获取元素并将其添加到我们的总数中。
但是,鉴于我们有内置函数可以为我们执行此操作,因此效率较低且毫无意义。一般来说,使用zip()。
【讨论】:
sum() 函数来做到这一点(在编辑中的代码)。
[sum(row[i] for row in array) for i in range(len(array[0]))]
应该这样做。 len(array[0]) 是列数,因此 i 会遍历这些列。生成器表达式 row[i] for row in array 遍历所有行并为每个列号选择一个列。
【讨论】:
我认为最简单的方法是这样的:
sumcolumn=data.sum(axis=0)
print (sumcolumn)
【讨论】:
你可以使用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
【讨论】:
您可能对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.
【讨论】:
你可以使用numpy:
import numpy as np
a = np.array([[1,2,3],[1,2,3]])
a.sum(0)
【讨论】: