Сумма каждых 3-х элементов numpy массива
Есть numpy массив. В реальности он гораздо больше:
arr = [1, 0, 1, 0, 0, 2, 0, 3, 1]
Задача посчитать сумму каждых трех элементов, пример:
1+0+1=2
0+1+0=1
1+0+0=1
0+0+2=2
0+2+0=2
2+0+3=5
0+3+1=4
new_arr = [2, 1, 1, 2, 2, 5, 4]
Ответы (3 шт):
Автор решения: CrazyElf
→ Ссылка
У вас обычный массив питона. Просто итерируетесь параллельно с помощью zip по массиву со сдвигами 0, 1 и 2, и берёте сумму на каждой итерации:
arr = [1, 0, 1, 0, 0, 2, 0, 3, 1]
print(list(map(sum, zip(arr, arr[1:], arr[2:]))))
# [2, 1, 1, 2, 2, 5, 4]
Или вот вариант всё же с использованием Numpy, просто складываете массивы, опять же со сдвигом, но в отличие от варианта с использованием zip (который смотрит на размер наименьшего массива), тут массивы надо выровнять по размеру, поэтому срезы нужны более точные:
import numpy as np
arr = np.array([1, 0, 1, 0, 0, 2, 0, 3, 1])
print(arr[:-2] + arr[1:-1] + arr[2:])
# array([2, 1, 1, 2, 2, 5, 4])
Автор решения: Кирилл Малышев
→ Ссылка
Вам нужна одномерная свёртка:
new_arr = np.convolve(arr, [1, 1, 1], 'valid')
Автор решения: MBo
→ Ссылка
Для целых чисел, чтобы не пересчитывать суммы, можно сделать так:
arr = [1, 0, 1, 0, 0, 2, 0, 3, 1]
s = sum(arr[:3])
print(s, end = " ")
for i in range(3, len(arr)):
s += arr[i]-arr[i-3]
print(s, end = " ")
2 1 1 2 2 5 4