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 语句处理
我有一个数组:
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 语句处理