如何使用Numpy将数组分割为滑动式等长子数组?
使用Numpy实现滑动窗口分割数组
你需要的是步长为1、窗口大小为4的滑动窗口分割,np.array_split是无重叠的均分逻辑,不符合需求。下面提供两种基于Numpy的解决方案:
方法一:使用np.lib.stride_tricks.sliding_window_view(推荐,Numpy 1.20+)
这是Numpy官方推出的专门用于滑动窗口的工具,安全且简洁,无需手动处理内存 stride:
import numpy as np my_array = np.array([1,2,3,4,5,6,7,8,9,10,11,12,13,14]) # 窗口大小设为4,步长默认1 windowed_array = np.lib.stride_tricks.sliding_window_view(my_array, window_shape=4) print(windowed_array)
输出结果:
[[ 1 2 3 4] [ 2 3 4 5] [ 3 4 5 6] [ 4 5 6 7] [ 5 6 7 8] [ 6 7 8 9] [ 7 8 9 10] [ 8 9 10 11] [ 9 10 11 12] [10 11 12 13] [11 12 13 14]]
结果是一个形状为(11,4)的二维数组,正好对应你需要的11个重叠子数组。
方法二:使用np.lib.stride_tricks.as_strided(兼容旧版Numpy)
如果你使用的Numpy版本低于1.20,可以手动通过as_strided实现,但需要注意:直接操作内存 stride 可能导致越界访问,必须严格计算形状和步长:
import numpy as np my_array = np.array([1,2,3,4,5,6,7,8,9,10,11,12,13,14]) window_size = 4 # 计算子数组数量 num_windows = len(my_array) - window_size + 1 # 获取数组元素的字节大小 element_size = my_array.itemsize # 构建滑动窗口数组 windowed_array = np.lib.stride_tricks.as_strided( my_array, shape=(num_windows, window_size), strides=(element_size, element_size) ) print(windowed_array)
输出结果和方法一完全一致,但这种方法需要手动管理 stride,不如sliding_window_view安全,优先推荐方法一。
内容的提问来源于stack exchange,提问作者Tolga Dönmez
相关产品推荐
相关产品推荐

