Как суммировать 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