有没有一种numpy的方式可以在区间内每三个元素进行求和?例如:
import numpy as np
mydata = np.array([4, 2, 3, 8, -6, 10])
我希望获得这个结果:
np.array([9, 13, 5, 12])
有没有一种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')
卷积
的基本思想是,我们有一个核,我们将其滑动通过输入数组,并且卷积操作将内核元素乘以元素之和加起来,当内核滑过时。因此,为了解决窗口大小为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()