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

标签 python performance numpy scipy max

我想创建一个数组,其中包含在给定 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/

相关文章:

python - SQLAlchemy 插入忽略

python - 使用 matplotlib 绘制 SQL (MariaDB) 中的表值

iphone - AutoLayout 的 UITableViewCell 性能不佳

python - 在 Numpy 数组中查找多个值

python - 将 c++ vector 传递给 python 并返回

python - 从基于登录的网站抓取数据时如何避免被禁止?

python - 在 Unix 中为 Python 安装命名以及 shebang 的良好使用

JavaScript 替换为回调 - 性能问题

.net - .NET 中的 Levenshtein DFA

python - 如何在 Python 中推断曲线?