在滑动窗口中求和元素 - NumPy

时间:2016-07-21 14:57:49

标签: python numpy

在这个区间内,每个三个元素都有一个简单的方法吗?例如:

import numpy as np
mydata = np.array([4, 2, 3, 8, -6, 10])

我想得到这个结果:

np.array([9, 13, 5, 12])

3 个答案:

答案 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()