【问题标题】:How to sum a 2d array in Python?如何在 Python 中对二维数组求和?
【发布时间】:2012-05-23 03:43:01
【问题描述】:

我想在 python 中求和一个二维数组:

这是我所拥有的:

def sum1(input):
    sum = 0
    for row in range (len(input)-1):
        for col in range(len(input[0])-1):
            sum = sum + input[row][col]

    return sum


print sum1([[1, 2],[3, 4],[5, 6]])

它显示4 而不是21 (1+2+3+4+5+6 = 21)。我的错在哪里?

【问题讨论】:

  • reduce(lambda x, y: x + sum(y), [[1, 2],[3, 4],[5, 6]], 0) :-)。但是,是的,正如其他人指出的那样,问题在你的范围内。

标签: python


【解决方案1】:

我觉得这样更好:

 >>> x=[[1, 2],[3, 4],[5, 6]]                                                   
>>> sum(sum(x,[]))                                                             
21

【讨论】:

  • 然而,可读性并不高。它首先将 2-d 扁平化为 1-d,然后将其总结起来......也不是非常有效。
  • 看起来不错,但远未达到最佳资源使用率。大矩阵可能会很慢!
  • 谁能解释一下这里发生了什么?
【解决方案2】:

您可以将该函数重写为,

def sum1(input):
    return sum(map(sum, input))

基本上,map(sum, input) 将返回一个包含所有行总和的列表,然后,最外面的 sum 将添加该列表。

例子:

>>> a=[[1,2],[3,4]]
>>> sum(map(sum, a))
10

【讨论】:

  • 你知道map(sum,a)的输出是否可行吗?
【解决方案3】:

而 numpy 的解决方案就是:

import numpy as np
x = np.array([[1, 2],[3, 4],[5, 6]])

结果:

>>> b=np.sum(x)
   print(b)
21

【讨论】:

  • 如果您发现您正在使用isinstance 来解决如此简单的问题,那么您可能正在以强类型的方式思考。这是一个过于复杂的答案。
  • @msw,是的,但是以这种方式使用递归有其优势,因为它更灵活,正如我展示的那样,它适用于任何奇怪形式的列表。但至少我的答案的另一部分很简单:)。
  • 确实更灵活。我发现在 stackoverflow 和一般的编码中,过度的灵活性有时是一种负担。例如,我宁愿看到sum([1, [2, 3]]) 引发 TypeError,也不愿猜测我的意图。这对于关于 SO 的新手问题尤其重要。
【解决方案4】:

这是另一个替代解决方案

In [1]: a=[[1, 2],[3, 4],[5, 6]]
In [2]: sum([sum(i) for i in a])
Out[2]: 21

【讨论】:

    【解决方案5】:

    更好的是,忘记索引计数器,只对项目本身进行迭代:

    def sum1(input):
        my_sum = 0
        for row in input:
            my_sum += sum(row)
        return my_sum
    
    print sum1([[1, 2],[3, 4],[5, 6]])
    

    Python 的一个很好的(和惯用的)特性是让它为您计算。 sum() 是内置的,您不应使用内置名称作为自己的标识符。

    【讨论】:

      【解决方案6】:

      这就是问题

      for row in range (len(input)-1):
          for col in range(len(input[0])-1):
      

      试试

      for row in range (len(input)):
          for col in range(len(input[0])):
      

      Python 的 range(x) 已经从 0..x-1 开始了

      范围(...) range([start,] stop[, step]) -> 整数列表

      Return a list containing an arithmetic progression of integers.
      range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.
      When step is given, it specifies the increment (or decrement).
      For example, range(4) returns [0, 1, 2, 3].  The end point is omitted!
      These are exactly the valid indices for a list of 4 elements.
      

      【讨论】:

        【解决方案7】:

        range() 在 python 中排除了最后一个元素。换句话说,range(1, 5) 是 [1, 5) 或 [1, 4]。所以你应该只使用len(input) 来遍历行/列。

        def sum1(input):
            sum = 0
            for row in range (len(input)):
                for col in range(len(input[0])):
                    sum = sum + input[row][col]
        
            return sum
        

        【讨论】:

          【解决方案8】:

          不要将 -1 放在 range(len(input)-1) 中,而是使用:

          range(len(input))
          

          range 自动返回一个比参数值小一的列表,因此无需显式给出 -1

          【讨论】:

            【解决方案9】:
            def sum1(input):
                return sum([sum(x) for x in input])
            

            【讨论】:

              【解决方案10】:

              快速回答,使用...

              total = sum(map(sum,[array]))
              

              [array] 是您的数组标题。

              【讨论】:

              • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。一个适当的解释将通过展示为什么这是解决问题的好方法来极大地提高其长期价值,并使其对有其他类似问题的未来读者更有用。请编辑您的答案以添加一些解释,包括您所做的假设。
              【解决方案11】:

              在 Python 3.7 中

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

              输出

              10
              

              【讨论】:

                【解决方案12】:

                似乎普遍的共识是 numpy 是一个复杂的解决方案。与更简单的算法相比。但是为了给出答案:

                import numpy as np
                
                
                def addarrays(arr):
                
                    b = np.sum(arr)
                    return sum(b)
                
                
                array_1 = [
                  [1, 2],
                  [3, 4],
                  [5, 6]
                ]
                print(addarrays(array_1))
                

                这似乎是首选的解决方案:

                x=[[1, 2],[3, 4],[5, 6]]                                                   
                sum(sum(x,[]))                                                             
                

                【讨论】:

                  【解决方案13】:
                  def sum1(input):
                      sum = 0
                      for row in input:
                          for col in row:
                              sum += col
                      return sum
                  print(sum1([[1, 2],[3, 4],[5, 6]]))
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-01-21
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-11-19
                    相关资源
                    最近更新 更多