基于窗口大小与步长的向量重塑技术咨询(附示例)
如何将向量按指定窗口大小和步长重塑为目标矩阵
嘿,这个需求我之前处理过,咱们先把需求明确下来,再一步步实现它~
给定向量
A = [1 2 3 4 5 6 7 8],需要按照 window size=4(窗口大小为4)、step size=2(滑动步长为2)的规则重塑为矩阵,预期结果:b = [ 1 3 5; 2 4 6; 3 5 7; 4 6 8 ]
先拆解下逻辑:这个需求本质是先从原向量中以步长2滑动截取大小为4的窗口,再把这些窗口作为列组成最终矩阵(或者说把滑动窗口的结果转置)。下面我给你两种常用工具的实现方法:Python(numpy)和Matlab。
Python 实现(基于numpy)
Python里用numpy可以快速搞定,推荐两种方法:
方法1:官方滑动窗口工具(Python 3.10+ 推荐)
numpy从3.10版本开始提供了sliding_window_view函数,专门处理滑动窗口,用法超直观:
import numpy as np A = np.array([1, 2, 3, 4, 5, 6, 7, 8]) window_size = 4 step_size = 2 # 生成滑动窗口,得到(3,4)的数组(3个窗口,每个窗口4个元素) windows = np.lib.stride_tricks.sliding_window_view(A, window_size)[::step_size] # 转置后就是目标矩阵 b = windows.T print(b)
运行后输出的就是你要的结果:
[[1 3 5] [2 4 6] [3 5 7] [4 6 8]]
方法2:手动构造索引(兼容旧版本)
如果你的numpy版本比较老,不支持sliding_window_view,可以手动构造索引来实现:
import numpy as np A = np.array([1, 2, 3, 4, 5, 6, 7, 8]) window_size = 4 step_size = 2 # 计算每个窗口的起始索引:0, 2 start_indices = np.arange(0, len(A) - window_size + 1, step_size) # 构造每个窗口的索引矩阵(4行3列) indices = start_indices + np.arange(window_size)[:, np.newaxis] # 通过索引提取元素得到目标矩阵 b = A[indices] print(b)
Matlab 实现
Matlab里有现成的函数可以用,也可以手动实现:
方法1:用buffer函数(最简便)
Matlab的buffer函数专门用来处理这类分块/滑动窗口的需求,参数设置对了直接出结果:
A = [1 2 3 4 5 6 7 8]; window_size = 4; step_size = 2; % buffer函数会直接把每个窗口作为列返回,刚好是我们要的矩阵 b = buffer(A, window_size, window_size - step_size, 'nodelay'); disp(b);
运行后直接输出目标矩阵:
1 3 5 2 4 6 3 5 7 4 6 8
这里window_size - step_size是窗口重叠的长度(4-2=2),'nodelay'表示从第一个元素开始就生成窗口,不做延迟。
方法2:手动构造索引
如果不想用内置函数,手动生成索引也很简单:
A = [1 2 3 4 5 6 7 8]; window_size = 4; step_size = 2; % 计算窗口数量 num_windows = floor((length(A) - window_size)/step_size) + 1; % 构造索引矩阵 indices = repmat((1:window_size)', 1, num_windows) + repmat((0:step_size:(num_windows-1)*step_size), window_size, 1); % 通过索引提取元素得到目标矩阵 b = A(indices); disp(b);
内容的提问来源于stack exchange,提问作者Sangeetha R
相关产品推荐
相关产品推荐

