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

Ron*_*ing 13 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]])
Run Code Online (Sandbox Code Playgroud)

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

hit*_*it9 37

我认为这更好:

 >>> x=[[1, 2],[3, 4],[5, 6]]                                                   
>>> sum(sum(x,[]))                                                             
21
Run Code Online (Sandbox Code Playgroud)

  • 谁能解释一下这是怎么回事? (6认同)
  • 然而,可读性并不好。它首先将二维扁平化为一维,然后将其求和......也不是非常高效。 (3认同)
  • 看起来不错,但远非最佳资源使用。大矩阵可能会很慢! (2认同)

mac*_*how 25

你可以重写那个函数,

def sum1(input):
    return sum(map(sum, input))
Run Code Online (Sandbox Code Playgroud)

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

例:

>>> a=[[1,2],[3,4]]
>>> sum(map(sum, a))
10
Run Code Online (Sandbox Code Playgroud)


Aka*_*all 8

而 numpy 解决方案只是:

import numpy as np
x = np.array([[1, 2],[3, 4],[5, 6]])
Run Code Online (Sandbox Code Playgroud)

结果:

>>> b=np.sum(x)
   print(b)
21
Run Code Online (Sandbox Code Playgroud)

  • 如果你发现你正在使用 `isinstance` 来解决像这样简单的问题,那么你可能正在以强类型的方式思考。这是一个过于复杂的答案。 (2认同)

msw*_*msw 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]])
Run Code Online (Sandbox Code Playgroud)

Python的一个很好的(和惯用的)功能是让它为你做计数.sum()是内置的,您不应该使用内置的名称作为您自己的标识符.


Aja*_*jay 6

这是另一个替代解决方案

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


dfb*_*dfb 5

这是问题

for row in range (len(input)-1):
    for col in range(len(input[0])-1):
Run Code Online (Sandbox Code Playgroud)

尝试

for row in range (len(input)):
    for col in range(len(input[0])):
Run Code Online (Sandbox Code Playgroud)

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

range(...)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.
Run Code Online (Sandbox Code Playgroud)