我想创建一个数组,其中包含在给定 numpy 数组中移动的窗口的所有 max()
es。如果这听起来令人困惑,我很抱歉。我举个例子。输入:
[ 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()
,但无法找到一种方法来实现我的目标。
有什么想法可以有效地做到这一点吗?
最佳答案
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]
关于python - NumPy 数组中滑动窗口中的最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43288542/