只是想知道是否有办法在 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]
你可以使用 滑动窗口 技术来解决这个问题。在 Python 中,可以通过使用 collections.deque 或者简单的切片方法来实现滑动窗口。
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 方法或使用滑动窗口的特殊函数会更加高效:
convolve
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 可以提高效率,特别是在处理大数组时。