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

mar*_*ues 5 python numpy

有一个numpy方法在区间中每三个元素做一个总和?例如:

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

我想得到这个结果:

np.array([9, 13, 5, 12])
Run Code Online (Sandbox Code Playgroud)

Div*_*kar 14

我们可以用np.convolve-

np.convolve(mydata,np.ones(3,dtype=int),'valid')
Run Code Online (Sandbox Code Playgroud)

基本思想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])
Run Code Online (Sandbox Code Playgroud)


Xav*_*hot 9

从 开始Numpy 1.20sliding_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])
Run Code Online (Sandbox Code Playgroud)

在哪里:

  • 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]])
Run Code Online (Sandbox Code Playgroud)