我想创建一个数组,它包含给定 numpy 数组的移动窗口中的所有 max()
值。如果这听起来令人困惑,请看以下例子。输入:
[ 6,4,8,7,1,4,3,5,7,2,4,6,2,1,3,5,6,3,4,7,1,9,4,3,2 ]
我的输出窗口宽度为5时应该是这样的:
[ 8,8,8,7,7,7,7,7,7,6,6,6,6,6,6,7,7,9,9,9,9 ]
每个数字都应该是输入数组的宽度为5的子数组的最大值:
[ 6,4,8,7,1,4,3,5,7,2,4,6,2,1,3,5,6,3,4,7,1,9,4,3,2 ]
\ / \ /
\ / \ /
\ / \ /
\ / \ /
[ 8,8,8,7,7,7,7,7,7,6,6,6,6,6,6,7,7,9,9,9,9 ]
在NumPy中,我没有找到一个现成的函数可以做到这一点(但如果有的话,我也不会感到惊讶;毕竟我并不总是按照NumPy开发人员的思路来思考)。我考虑创建一个输入数据的2D移位版本:
[ [ 6,4,8,7,1,4,3,5,7,8,4,6,2,1,3,5,6,3,4,7,1 ]
[ 4,8,7,1,4,3,5,7,8,4,6,2,1,3,5,6,3,4,7,1,9 ]
[ 8,7,1,4,3,5,7,8,4,6,2,1,3,5,6,3,4,7,1,9,4 ]
[ 7,1,4,3,5,7,8,4,6,2,1,3,5,6,3,4,7,1,9,4,3 ]
[ 1,4,3,5,7,8,4,6,2,1,3,5,6,3,4,7,1,9,4,3,2 ] ]
我可以对此应用np.max(input, 0)
,然后得到我的结果。但在我的情况下,这似乎并不高效,因为我的数组和窗口宽度都可能很大(>1000000个条目和>100000个窗口宽度)。数据将会按窗口宽度多多少少地被放大。
我也考虑过以某种方式使用np.convolve()
,但无法找到实现目标的方法。
有什么好的方法可以高效地完成这个任务吗?
a = np.array(…)
,pd.rolling_max(a, window=5)
。到目前为止,这似乎是我处理的最佳选项。@Divakar的strides
解决方案如果适用于我的尺寸,将会更快,因此在接受这个答案之前我还在等待。 - Alfe