In [99]: A = np.random.randint(0, 10, (3, 4))
In [100]: A
Out[100]:
array([[1, 4, 0, 9],
[5, 5, 3, 0],
[3, 2, 1, 2]])
In [101]: A.cumsum(axis=0).cumsum(axis=1)
Out[101]:
array([[ 1, 5, 5, 14],
[ 6, 15, 18, 27],
[ 9, 20, 24, 35]])
itertools
имеет инструмент accumulate
, который ведет себя как cumsum
:
https://docs.python.org/3/library/itertools.html#itertool-functions
In [102]: from itertools import accumulate
In [103]: Al = A.tolist()
In [105]: [list(accumulate(row)) for row in Al]
Out[105]: [[1, 5, 5, 14], [5, 10, 13, 13], [3, 5, 6, 8]]
In [106]: [list(accumulate(row)) for row in zip(*_)]
Out[106]: [[1, 6, 9], [5, 15, 20], [5, 18, 24], [14, 27, 35]]
In [107]: list(zip(*_))
Out[107]: [(1, 5, 5, 14), (6, 15, 18, 27), (9, 20, 24, 35)]
или упакован в одно выражение:
In [109]: list(zip(*
...: (accumulate(row) for row in zip(*
...: (accumulate(row) for row in Al)))))
...:
Out[109]: [(1, 5, 5, 14), (6, 15, 18, 27), (9, 20, 24, 35)]
Если вы также не можете использовать itertools
, используйте генератор rough equivalent
, указанный на странице документации.
Или с этой небольшой функцией накопления:
def accum(alist):
total = 0; res = []
for a in alist:
total += a
res.append(total)
return res
In [111]: list(zip(*
...: (accum(row) for row in zip(*
...: (accum(row) for row in Al)))))
Out[111]: [(1, 5, 5, 14), (6, 15, 18, 27), (9, 20, 24, 35)]