суммирующий элемент в диапазоне для всех элементов в массиве - PullRequest
0 голосов
/ 13 декабря 2018

Я должен получить общую сумму диапазона из массива.Однако диапазон массива должен перемещаться от одного элемента к другому.например, если массив равен 1,2,3,4,5,6 и если необходимо добавить каждые два элемента, он должен добавить 1+2, чем 2+3, чем 3+4 и т. д.

Я пытался, но не получалправильный подход.Я уверен, что есть питонский способ сделать это.

здесь то, что я пытался

data = np.arange(0,20,.3)
for i in range (0,len(data)):
    for j in range(i,len(data)):
        get_range = data[j:5]
        get_add = get_range.sum()
        print("sum:",get_add) 

Я попытался добавить каждые 5 элементов здесь.

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Незначительное изменение решит проблему

data = np.arange(0,10)

for j in range(0,len(data)-1):
    get_range = data[j:j+2] #changed from j to j+2
    get_add = get_range.sum()
    print("sum:",get_add) 

ВЫХОД

('sum:', 1)
('sum:', 3)
('sum:', 5)
('sum:', 7)
('sum:', 9)
('sum:', 11)
('sum:', 13)
('sum:', 15)
('sum:', 17)

Вы можете легко объединить вышеописанные шаги, чтобы сформировать представление списка, дающее те же результатыс такой же сложностью

[sum(data[j:j+2]) for j in range(0,len(data)-1)]

Другой причудливый подход мог бы использовать sliding_window функцию

from toolz.itertoolz import sliding_window
map(sum,list(sliding_window(2,list(range(0,10)))))

Вывод

[1, 3, 5, 7, 9, 11, 13, 15, 17]
0 голосов
/ 13 декабря 2018

Существует простой способ сделать это.Это более эффективно для памяти и процессора, если ваши входные данные достаточно велики.

import numpy as np

# input array: [1, 2, 3, 4, 5, 6]
data = np.arange(1, 7)

# cumulative sum: [1, 3, 6, 10, 15, 21]
data_cumsum = np.cumsum(data)

# append zero to start: [0, 1, 3, 6, 10, 15, 21]
data_cumsum = np.hstack([0, data_cumsum])

# calculate moving sum
window = 2
moving_sum = data_cumsum[window:] - data_cumsum[:-window]

print(moving_sum)

Вывод:

[ 3  5  7  9 11]
0 голосов
/ 13 декабря 2018

Вы можете использовать список , который извлекает список chunks.

l = [1,2,3,4,5,6]
n = 2
output = [sum(l[i:i + n]) for i in range(0, len(l) - n + 1, 1)]

Выход

[3, 5, 7, 9, 11]
...