NumPy数组中滑动窗口中的最大值

问题描述

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]

为了保持一致,您可以将的每个元素强制转换lst1int

[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()以某种方式使用,但无法找到一种方法来实现我的目标。

任何想法如何有效地做到这一点?