Как суммировать 2d-массив в Python?

Я хочу суммировать 2-мерный массив в 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). Где моя ошибка?

Ответ 1

Это проблема

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 уже

диапазон (...)     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.

Ответ 2

Я думаю, что это лучше:

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

Ответ 3

Вы можете переписать эту функцию как

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

В принципе, map(sum, input) вернет список с суммами по всем вашим строкам, тогда внешний sum будет содержать этот список.

Пример:

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

Ответ 4

Еще лучше забыть счетчики индексов и просто перебирать сами элементы:

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() является встроенным, и вы не должны использовать имена встроенных модулей для своих собственных идентификаторов.

Ответ 5

Это еще одно альтернативное решение

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

Ответ 6

И решение NumPy просто:

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

Результат:

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

Ответ 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 в диапазон (len (input) -1) вместо этого используйте:

range(len(input))
Диапазон

автоматически возвращает список на один меньше значения аргумента, поэтому нет необходимости явно указывать -1

Ответ 9

Быстрый ответ, используйте...

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

где [array] - это заголовок вашего массива.

Ответ 10

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

Ответ 11

В Python 3.7

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

выходы

10