[英]Summing elements in a sliding window - NumPy
有一种 numpy 方法可以对间隔中的每三个元素求和? 例如:
import numpy as np
mydata = np.array([4, 2, 3, 8, -6, 10])
我想得到这个结果:
np.array([9, 13, 5, 12])
我们可以使用np.convolve
-
np.convolve(mydata,np.ones(3,dtype=int),'valid')
convolution
的基本思想是我们有一个内核,我们可以在输入数组中滑动,当内核滑动时,卷积运算将与内核元素相乘的元素相加。 因此,为了解决窗口大小为3
,我们使用了由np.ones(3)
生成的三个1s
的内核。
样品运行 -
In [334]: mydata
Out[334]: array([ 4, 2, 3, 8, -6, 10])
In [335]: np.convolve(mydata,np.ones(3,dtype=int),'valid')
Out[335]: array([ 9, 13, 5, 12])
在开始Numpy 1.20
,所述sliding_window_view
提供了一种方式,通过元件的窗口滑动/滚动。 然后您可以单独求和的窗口:
from numpy.lib.stride_tricks import sliding_window_view
# values = np.array([4, 2, 3, 8, -6, 10])
np.sum(sliding_window_view(values, window_shape = 3), axis = 1)
# array([9, 13, 5, 12])
其中:
window_shape
是滑动窗口的大小np.sum(array, axis = 1)
对子数组求和滑动的中间结果是:
sliding_window_view(np.array([4, 2, 3, 8, -6, 10]), window_shape = 3)
# array([[ 4, 2, 3],
# [ 2, 3, 8],
# [ 3, 8, -6],
# [ 8, -6, 10]])
不使用外部库的解决方案可能如下所示:
from collections import deque
def sliding_window_sum(a, size):
out = []
the_sum = 0
q = deque()
for i in a:
if len(q)==size:
the_sum -= q[0]
q.popleft()
q.append(i)
the_sum += i
if len(q)==size:
out.append(the_sum)
return out
v = [0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1]
sliding_window_sum(v, 5)
这给出了输出:
[1, 2, 3, 3, 4, 4, 3, 2, 3, 2, 1, 1, 1, 0, 0, 1]
这与使用 numpy 的结果相匹配:
import numpy as np
np.convolve(v, np.ones(5, dtype=int),'valid').tolist()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.