【问题标题】:python sum all next n values in array at each indexpython在每个索引处对数组中的所有下n个值求和
【发布时间】:2020-08-11 17:44:20
【问题描述】:

我有一个数组:

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)  ``` 

【问题讨论】:

标签: python arrays numpy sum cumsum


【解决方案1】:

这应该使用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)

【讨论】:

    【解决方案2】:

    a 是你的数组:

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

    【讨论】:

      【解决方案3】:

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

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

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

      编辑: 修复了“接下来的 3 个值”,因为我一开始没有意识到。

      【讨论】:

      • 它应该是sum(my_array[pos+1:pos+4]),因为操作要求接下来的 3 个值。
      【解决方案4】:

      如果您想尽量减少执行的加法次数,最好有一个指针,这样您就可以为每个索引加减一次,而不是加 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
      

      请注意,空数组当前会返回 [0]。如果您打算返回一个空数组,那将是一种边缘情况,可以在开始时由 if 语句处理

      【讨论】:

        【解决方案5】:

        这是可以做到的

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

        【讨论】:

        • min 是不必要的,因为在超出索引范围之前切片会自动停止。
        猜你喜欢
        • 1970-01-01
        • 2021-11-25
        • 1970-01-01
        • 1970-01-01
        • 2015-10-19
        • 2019-04-06
        • 1970-01-01
        • 2020-04-03
        • 1970-01-01
        相关资源
        最近更新 更多