python 对数组中每个索引处接下来的 n 个值求和

python sum all next n values in array at each index

我有一个数组:

my_array = [1, 13, 6, 100, 12,23,45] 并想为 my_array 中的每个索引创建一个新数组,它是 3 个下一个索引值

的总和

summed_array = [119, 118, 135, 80, 68,45,0] 我尝试了 np.cumsum 之类的东西,但是这个累积值

import numpy as np

sum_value = 0

my_array = [1, 13, 6, 100, 12,23,45]
summed_array = [0, 0, 0, 0, 0,0,0]
print(len(my_array))
for ind,i in enumerate(my_array):
    if ind+3< len(my_array):
        summed_array[ind] =my_array[ind+1]+my_array[ind+2]+my_array[ind+3]
    elif ind+2 < len(my_array):
         summed_array[ind] =my_array[ind+1]+my_array[ind+2]
    elif ind+1 < len(my_array):
        summed_array[ind]=my_array[ind+1]
    else:
        summed_array[ind] = 0
print(summed_array)  ``` 

这应该可以使用 slices

import numpy as np

sum_value = 0

my_array = [1, 13, 6, 100, 12,23,45]
summed_array = [0, 0, 0, 0, 0,0,0]
n = 3;
print(len(my_array))
for i in range(len(summed_array)):
    summed_array[i] = sum(my_array[i+1:i+1+n])
print(summed_array)

这是可以做到的

a = my_array
summed_array= [sum(a[i:i+3]) for i in range(len(a))]

你也可以在列表理解中做到这一点:

sum_array = [ sum(my_array[pos+1:pos+4]) for pos in range(len(my_array)) ]

这样就不需要声明 sum_array,因为它总是会以正确的大小创建。

编辑: 修复了 'next 3 values',因为我一开始没有意识到它。

a 是你的数组:

>>> c = a.cumsum()
>>> np.concatenate((c[3:], [a.sum()] * 3)) - c
array([119, 118, 135,  80,  68,  45,   0])

如果您想尽量减少执行的加法次数,最好有一个指针,这样您就可以为每个索引加减一次,而不是加减 3 次。不过,您可能会发现比这更优化的不同解决方案。如果是这样,请告诉我 :) 让 a 成为你的数组。

# Initialize sum array sa with first index
val = sum(a[1:4])
sa = [val]
i = 1

# Get sum for all except last 3 indices
for i in range(1, len(a) - 3):
  val = val + a[i + 3] - a[i]
  sa.append(val)

# Account for the last 3 indices
while i < len(a):
  val -= a[i]
  sa.append(val)
  i += 1

# sa is the array needed at this point

请注意,空数组当前 return [0]。如果您打算 return 一个空数组,那将是一个边缘情况,可以由开头的 if 语句处理