2015-11-24 2 views
3

У меня есть массив:питон сумма всех предыдущих значений в массиве при каждом индексе

my_array = [1, 4, 1, 13, 9] 

и хотели бы создать новый массив, который для каждого индекса в my_array является сумма всех предыдущих значений индексов

summed_array = [0, 1, 5, 6, 19] 

Я пытался что-то вроде

for ind,i in enumerate(my_array): 
    print i, my_array[ind-1] 

, но не могу понять, как получить суммирование всех предыдущих значения.

+1

вы можете использовать 'np.cumsum' – Julien

+3

Если Google [NumPy накопленная сумма] (https: //www.google.c om/search? q = numpy + суммарная + сумма), вы обнаружите, что первый хит отвечает на ваш вопрос. Пожалуйста, возьмите хотя бы этот базовый шаг, чтобы попытаться найти ответы перед публикацией. – user2357112

ответ

4
>>> from numpy import cumsum, ones 
>>> a = ones(10) 
>>> print(cumsum(a)) 
array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.]) 
+0

@IanAuld: Это в тегах, поэтому они, вероятно, уже используют его. – user2357112

0

Чистый реализация Python:

def cumilative_sum(lst): 
    total, result = 0, [] 
    for ele in lst: 
     result.append(total) 
     total += ele 
    return result 
+3

Когда решение линейного времени так просто, не используйте квадратичные решения. – user2357112

0
np.cumsum(my_array) - my_array 

np.cumsum возвращает массив кумулятивных сумм, причем каждая сумма происходит вплоть до соответствующего элемента во входном массиве. Вы хотите исключить соответствующие элементы из суммы, поэтому просто вычтите их.

0

Вот краткая и понятная реализация:

sum = 0 

my_array = [1, 4, 1, 13, 9] 
summed_array = [0, 0, 0, 0, 0] 

for ind,i in enumerate(my_array): 
    summed_array[ind] = sum 
    sum += my_array[ind] 

код в основном начинается назначая сумму с 0 и положить его в первый индекс summed_array, а затем добавляет каждый соответствующий индекс my_array подводить. Затем он возвращается к циклу for и присваивает каждому индексу summed_array предыдущие sum.

Выход будет:

>>> summed_array 

[0, 1, 5, 6, 19] 

..., который является завершающим ожидаемые суммы.

EDIT: Благодаря @IanAuld, он предложил другой способ сделать это без перечисления и инициализации значений 0:

sum = 0 

my_array = [1, 4, 1, 13, 9] 
summed_array = [] 

for i in my_array: 
    summed_array += [sum] 
    sum += i 
+0

Что краткое о создании отдельного списка 0 и использование перечисления и индексации вместо значений в списке напрямую? – IanAuld

+0

@IanAuld Да, аккуратное предложение! Благодаря! –

0

itertools.accumulate будет работать так же, как numpy.cumsum:

from operator import add 
from itertools import accumulate 
from operator import add 

def cum_sum(l): 
    return accumulate(l, add) 

In [22]: list(cum_sum(my_array)) 
Out[22]: [1, 5, 6, 19, 28] 

который будет точно соответствовать cumsum.

Если вы хотите игнорировать последний элемент:

from operator import add 
from itertools import islice, accumulate 


def cum_sum(l, take): 
    return accumulate(islice(my_array, 0, len(l)-take), add) 

In [16]: list(cum_sum(my_array, 1)) 
Out[16]: [1, 5, 6, 19] 

Чтобы точно соответствовать вашему выходу включая 0 и работать в python2 или 3 вы можете создать функцию генератора:

my_array = [1, 4, 1, 13, 9] 

def cum_sum(l): 
    sm = 0 
    for ele in l: 
     yield sm 
     sm += ele 

Выход :

In [5]: my_array = [1, 4, 1, 13, 9] 

In [6]: list(cum_sum(my_array)) 
Out[6]: [0, 1, 5, 6, 19] 
Смежные вопросы