如何在Python中求和2d数组?

时间:2012-05-23 03:43:02

标签: python

我想在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)。我的错误在哪里?

12 个答案:

答案 0 :(得分:24)

您可以将该功能重写为,

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

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

示例:

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

答案 1 :(得分:24)

我认为这更好:

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

答案 2 :(得分:6)

更好的是,忘记索引计数器,只是遍历项目本身:

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()是一个内置函数,您不应该使用内置函数的名称作为您自己的标识符。

答案 3 :(得分:5)

这是另一种替代解决方案

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

答案 4 :(得分:4)

这就是问题

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的范围(x)已经从0..x-1开始

  

范围(...)       范围([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.

答案 5 :(得分:4)

您可以使用递归解决方案:

def sum_up(x):
    my_sum = 0
    for ele in x:
        if isinstance(ele, int):
            my_sum += ele
        elif isinstance(ele, list):
            my_sum += sum_up(ele)
    return my_sum

结果:

>>> sum_up([[1, 2],[3, 4],[5, 6]])
21
>>> sum_up([[[2,2],2,[[3,2],1]]])
12

numpy解决方案只是:

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

结果:

>>> np.sum(x)
21

答案 6 :(得分:1)

python中的

range()排除了最后一个元素。换句话说,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

答案 7 :(得分:1)

不要在范围内放置-1(len(输入)-1)而是使用:

range(len(input))

范围自动返回一个小于参数值的列表,因此不需要显式给出-1

答案 8 :(得分:1)

快速回答,使用......

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

其中[array]是您的数组标题。

答案 9 :(得分:0)

def sum1(input):
    return sum([sum(x) for x in input])

答案 10 :(得分:0)

在Python 3.7中

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

输出

10

答案 11 :(得分:0)

似乎普遍的共识是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,[]))