使用带有 numpy 数组 Python 的切片的求和函数

问题描述

有没有一种方法可以索引一个 numpy 列表,就像我在普通列表函数中的索引一样。我想遍历列表中的 3 个元素,每次向上移动一个点,并对所有切片求和。所以它会通过 1,2,3 获得第一个和,然后它会通过 2,3,4 获得第二个和等等。下面的代码给了我一个标量错误,有没有办法我可以执行这个函数下面不使用 for 循环。

import numpy as np
n = 3 
arr = np.array([1,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25])
start = np.arange(0,len(arr)-n,1)
stop = np.arange(n-1,len(arr),1)
sum_arr = np.sum(arr[start:stop])

解决方法

我认为这应该有效:

sum_arr = arr[1:-1] + arr[2:] + arr[:-2]

这将创建一个比 arr 短两个值的数组,因为 arr 中的最后一个元素没有两个额外的元素来创建总和。

如果您希望数组与原始 arr 的长度相同,则可以像这样在 arr 数组中附加两个额外的零:

arr = np.append(arr,[0,0])
sum_arr = arr[1:-1] + arr[2:] + arr[:-2]
,

要对 n 元素的滑动范围求和,您可以使用 convolve1d,并将所有权重设置为 1。使用 'constant' 边界模式,默认填充值为 0。由于过滤器窗口默认居中,因此您需要调整两端结果的长度。

import numpy as np 
from scipy.ndimage import convolve1d

arr = np.arange(1,26)

for n in range(2,6):
   k,r = divmod(n,2)
   print(n,convolve1d(arr,np.ones(n),mode='constant')[k+r-1:-k])

结果:

2 [ 3  5  7  9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49]
3 [ 6  9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72]
4 [ 10 14 18 22 26 30 34 38 42 46 50 54 58 62 66 70 74 78 82 86 90 94]
5 [ 15  20  25  30  35  40  45  50  55  60  65  70  75  80  85  90  95 100 105 110 115]