【问题标题】:How can I sum a column of a list?如何对列表的一列求和?
【发布时间】: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 for-loop


【解决方案1】:

使用for 循环(在generator expression 中):

data = [[1,2,3],
        [1,2,3]]

column = 1
print(sum(row[column] for row in data))  # -> 4

【讨论】:

    【解决方案2】:

    试试这个:

    a = [[1,2,3],
         [1,2,3]]
    
    print [sum(x) for x in zip(*a)]
    

    zip function description

    【讨论】:

      【解决方案3】:

      你不需要循环,使用zip()转置列表,然后取所需的列:

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

      (注意在 2.x 中,zip() 返回一个列表,因此您不需要 list() 调用)。

      编辑:不使用zip() 的最简单解决方案可能是:

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

      我们只是遍历行,获取元素并将其添加到我们的总数中。

      但是,鉴于我们有内置函数可以为我们执行此操作,因此效率较低且毫无意义。一般来说,使用zip()

      【讨论】:

      • 我在另一个答案中看到了这一点,但在学习如何更有效地做到这一点之前,我想知道如何做到这一点。
      • 暂时转置整个矩阵以求和其中一个结果行对我来说似乎不是很有效......也不使用内置的sum() 函数来做到这一点(在编辑中的代码)。
      【解决方案4】:
      [sum(row[i] for row in array) for i in range(len(array[0]))]
      

      应该这样做。 len(array[0]) 是列数,因此 i 会遍历这些列。生成器表达式 row[i] for row in array 遍历所有行并为每个列号选择一个列。

      【讨论】:

        【解决方案5】:

        我认为最简单的方法是这样的:

        sumcolumn=data.sum(axis=0)
        
        print (sumcolumn)
        

        【讨论】:

        • 看起来这个答案假定为 numpy,但确实改进了其他 numpy 答案。如果您填写此代码示例,它可能会对其他人有所帮助
        • 欢迎来到 SO。请阅读此how-to-answer 并遵循那里的指南以提供高质量的答案。
        【解决方案6】:

        你可以使用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
        

        【讨论】:

          【解决方案7】:

          您可能对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.
          

          【讨论】:

          • 我认为你的回答是错误的。您可能的意思是 a.sum(column_idx),但即使这样也是错误的,因为为了按照 OP 的要求按列获得总和,您需要 column_idx = 0
          【解决方案8】:

          你可以使用numpy:

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

          【讨论】:

            猜你喜欢
            • 2019-11-21
            • 2022-01-08
            • 1970-01-01
            • 1970-01-01
            • 2017-04-20
            • 1970-01-01
            • 1970-01-01
            • 2021-11-23
            • 1970-01-01
            相关资源
            最近更新 更多