[英]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.