在这个区间内,每个三个元素都有一个简单的方法吗?例如:
import numpy as np
mydata = np.array([4, 2, 3, 8, -6, 10])
我想得到这个结果:
np.array([9, 13, 5, 12])
答案 0 :(得分:12)
我们可以使用np.convolve
-
np.convolve(mydata,np.ones(3,dtype=int),'valid')
convolution
的基本思想是我们有一个内核可以滑过输入数组,并且卷积操作会在内核滑过时将元素乘以内核元素。因此,为了解决窗口大小为3
的情况,我们使用由1s
生成的三个np.ones(3)
内核。
示例运行 -
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])
答案 1 :(得分:2)
从 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]])
答案 2 :(得分:0)
不使用外部库的解决方案可能看起来像这样:
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()