簡體   English   中英

對滑動窗口中的元素求和 - NumPy

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM