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

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

本文介绍了NumPy 数组中滑动窗口中的最大值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建一个数组,其中包含在给定 numpy 数组中移动的窗口的所有 max()es.如果这听起来令人困惑,我很抱歉.我举个例子.输入:

I want to create an array which holds all the max()es of a window moving through a given numpy array. I'm sorry if this sounds confusing. I'll give an example. Input:

[ 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 的输出应该是这样的:

My output with a window width of 5 shall be this:

[     8,8,8,7,7,7,7,7,7,6,6,6,6,6,6,7,7,9,9,9,9     ]

每个数字应为输入数组宽度为 5 的子数组的最大值:

Each number shall be the max of a subarray of width 5 of the input array:

[ 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 版本:

I did not find an out-of-the-box function within numpy which would do this (but I would not be surprised if there was one; I'm not always thinking in the terms the numpy developers thought). I considered creating a shifted 2D-version of my input:

[ [ 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 个窗口宽度).数据或多或少会被窗口宽度的一个因素放大.

Then I could apply np.max(input, 0) on this and would get my results. But this does not seem efficient in my case because both my array and my window width can be large (>1000000 entries and >100000 window width). The data would be blown up more or less by a factor of the window width.

我也考虑过以某种方式使用 np.convolve() 但无法找到一种方法来实现我的目标.

I also considered using np.convolve() in some fashion but couldn't figure out a way to achieve my goal with it.

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

Any ideas how to do this efficiently?

推荐答案

Pandas 有一个用于 Series 和 DataFrames 的滚动方法,可以在这里使用:

Pandas has a rolling method for both Series and DataFrames, and that could be of use here:

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:

For consistency, you can coerce each element of lst1 to 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]

这篇关于NumPy 数组中滑动窗口中的最大值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-30 10:02