Таблица суммированных площадей без модуля python 3 - PullRequest
0 голосов
/ 27 октября 2018

Кто-нибудь знает, существует ли метод для создания таблицы суммированных областей (SAT) без модуля ??Я пробую это и работаю:

import numpy as np

A = np.random.randint(0, 10, (3, 4))

print (A)
print(A.cumsum(axis=0).cumsum(axis=1))

, но это с модулем numpy.

1 Ответ

0 голосов
/ 27 октября 2018
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)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...