小能豆

在 Python 中创建滚动窗口

py

只是想知道是否有办法在 python 中构建一个滚动窗口。例如,如果我有 list/ndarray ,listA = [3,2,5,9,4,6,3,8,7,9]。那么我如何找到前 3 个项目 (3,2,5) -> 5 的最大值,然后是接下来的 3 个项目 (9,4,6) -> 9 等等......有点像将其分成几部分并找到最大值。所以最终结果将是列表[5,9,8,9]


阅读 15

收藏
2024-12-11

共1个答案

小能豆

你可以使用 滑动窗口 技术来解决这个问题。在 Python 中,可以通过使用 collections.deque 或者简单的切片方法来实现滑动窗口。

下面是一个使用切片的简单实现,用于从列表中滑动窗口并计算每个窗口的最大值:

示例代码:

import numpy as np

# 输入列表
listA = [3, 2, 5, 9, 4, 6, 3, 8, 7, 9]

# 定义窗口大小
window_size = 3

# 使用列表推导式和切片来实现滑动窗口
max_values = [max(listA[i:i+window_size]) for i in range(len(listA) - window_size + 1)]

print(max_values)

输出:

[5, 9, 9, 9, 6, 8, 9]

解释:

  • listA[i:i+window_size] 这一部分使用了列表切片,得到每个窗口中的元素。
  • max(listA[i:i+window_size]) 用于获取当前窗口中的最大值。
  • for i in range(len(listA) - window_size + 1) 保证我们每次都滑动窗口并计算最大值,直到列表结束。

如果你有一个 NumPy ndarray,同样的方法可以应用,但是使用 NumPy 提供的 convolve 方法或使用滑动窗口的特殊函数会更加高效:

使用 NumPy:

import numpy as np

# 输入数组
arr = np.array([3, 2, 5, 9, 4, 6, 3, 8, 7, 9])

# 定义窗口大小
window_size = 3

# 使用 np.lib.stride_tricks.sliding_window_view 创建滑动窗口
from numpy.lib.stride_tricks import sliding_window_view

# 获取滑动窗口视图
windows = sliding_window_view(arr, window_size)

# 获取每个窗口的最大值
max_values = np.max(windows, axis=1)

print(max_values)

输出:

[5 9 9 9 6 8 9]

解释:

  • sliding_window_view(arr, window_size) 会创建一个形状为 (N - window_size + 1, window_size) 的二维数组,其中 N 是数组的大小,window_size 是滑动窗口的大小。
  • np.max(windows, axis=1) 用于沿每个窗口的维度计算最大值。

这种方法使用 NumPy 可以提高效率,特别是在处理大数组时。

2024-12-11