问题描述
Pandas对Series和DataFrame都有滚动方法,可以在这里使用:
import pandas as pd
lst = [6,4,8,7,1,4,3,5,7,8,4,6,2,1,3,5,6,3,4,7,1,9,4,3,2]
lst1 = pd.Series(lst).rolling(5).max().dropna().tolist()
# [8.0, 8.0, 8.0, 7.0, 7.0, 8.0, 8.0, 8.0, 8.0, 8.0, 6.0, 6.0, 6.0, 6.0, 6.0, 7.0, 7.0, 9.0, 9.0, 9.0, 9.0]
为了保持一致,您可以将的每个元素强制转换lst1
为int
:
[int(x) for x in lst1]
# [8, 8, 8, 7, 7, 8, 8, 8, 8, 8, 6, 6, 6, 6, 6, 7, 7, 9, 9, 9, 9]
解决方法
我想创建一个数组,其中包含max()
通过给定numpy数组移动的窗口的所有es。很抱歉,这听起来令人困惑。我举一个例子。输入:
[ 6,4,8,7,1,3,5,2,6,9,2 ]
我的窗口宽度为5的输出应为:
[ 8,9 ]
每个数字应为输入数组宽度5的子数组的最大值:
[ 6,2 ]
\ / \ /
\ / \ /
\ / \ /
\ / \ /
[ 8,9 ]
我没有在numpy中找到一个开箱即用的函数来做到这一点(但是如果有一个,我不会感到惊讶;我并不是一直以numpy开发人员的想法来思考)。我考虑过为输入创建偏移的2D版本:
[ [ 6,1 ]
[ 4,9 ]
[ 8,4 ]
[ 7,3 ]
[ 1,2 ] ]
然后,我可以np.max(input,0)
对此进行申请,并得到我的结果。但这对我来说似乎不太有效,因为数组和窗口宽度都可能很大(>
1000000个条目和> 100000个窗口宽度)。数据将因窗口宽度而增加或减少。
我也考虑过np.convolve()
以某种方式使用,但无法找到一种方法来实现我的目标。
任何想法如何有效地做到这一点?