Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 滑动窗口中的元素求和-NumPy_Python_Numpy - Fatal编程技术网

Python 滑动窗口中的元素求和-NumPy

Python 滑动窗口中的元素求和-NumPy,python,numpy,Python,Numpy,有一种简单的方法可以对区间中的每三个元素求和吗?例如: import numpy as np mydata = np.array([4, 2, 3, 8, -6, 10]) 我想得到这个结果: np.array([9, 13, 5, 12]) 我们可以使用- 其基本思想是,我们有一个内核,在输入数组中滑动,当内核滑动通过时,卷积运算将元素乘以内核元素求和。因此,为了解决窗口大小为3的问题,我们使用了由np.ones(3)生成的三个1s内核 样本运行- In [334]: mydata Out

有一种简单的方法可以对区间中的每三个元素求和吗?例如:

import numpy as np
mydata = np.array([4, 2, 3, 8, -6, 10])
我想得到这个结果:

np.array([9, 13, 5, 12])
我们可以使用-

其基本思想是,我们有一个内核,在输入数组中滑动,当内核滑动通过时,卷积运算将元素乘以内核元素求和。因此,为了解决窗口大小为
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])

不使用外部库的解决方案可能如下所示:

从集合导入数据
def滑动窗口总和(a,大小):
out=[]
总和=0
q=deque()
对于我来说,在一个:
如果len(q)=尺寸:
_和-=q[0]
q、 popleft()
q、 附加(i)
_sum+=i
如果len(q)=尺寸:
out.append(总和)
返回
v=[0,0,0,0,1,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1]
滑动窗口和(v,5)
它给出了输出:

[1, 2, 3, 3, 4, 4, 3, 2, 3, 2, 1, 1, 1, 0, 0, 1]
这与使用numpy的结果相匹配:

将numpy导入为np
np.convolve(v,np.one(5,dtype=int),'valid').tolist()

Numpy 1.20
开始,提供了在元素窗口中滑动/滚动的方法。然后可以单独求和的窗口:

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\u shape
    是滑动窗口的大小
  • np.sum(数组,轴=1)
    sums子数组
滑动的中间结果是:

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]])

@Ohumeronen解释
conv
可能需要一段时间。但是在帖子中添加了一些相关评论。哦,非常感谢你花时间。我看到这个函数看起来很复杂,但我也会阅读一些关于它的文档。再次感谢!可能重复的可能重复的啊现在我明白了。根据提供的数据,我尝试了np.convalve(mydata,[1,2],'valid'),但不理解为什么结果不是[8,8,19,-4,14]。但这是np.convolve(mydata,[2,1],'valid')的输出。现在一切都好了:-)
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]])