如何在Python中将3024x4032x3三维数组重塑为nx20x20x3四维数组?
滑动窗口提取图像子块并生成四维数组
方法一:使用skimage的view_as_windows(推荐)
view_as_windows是专门处理滑动窗口的工具,无需手动计算步长,生成的是原数组的视图(不占用额外内存),效率很高。
import numpy as np from skimage.util import view_as_windows # 假设img是已读取的(H, W, 3)格式NumPy数组 H, W, _ = img.shape window_size = (20, 20) # 生成滑动窗口,step=1表示窗口每次移动1个像素 windows = view_as_windows(img, window_shape=(20, 20, 3), step=1) # 将形状为(H-19, W-19, 20, 20, 3)的数组转为四维数组(子块总数, 20, 20, 3) four_d_array = windows.reshape(-1, 20, 20, 3)
方法二:纯NumPy实现
通过np.lib.stride_tricks.as_strided手动构造滑动窗口视图,需要计算数组的步长参数:
import numpy as np # 假设img是已读取的(H, W, 3)格式NumPy数组 H, W, _ = img.shape window_h, window_w = 20, 20 # 计算各维度的步长(字节数) strides = img.strides + img.strides[:2] # 定义输出形状:(窗口行数, 窗口列数, 窗口高, 窗口宽, 通道数) output_shape = (H - window_h + 1, W - window_w + 1, window_h, window_w, 3) # 生成滑动窗口视图 windows = np.lib.stride_tricks.as_strided(img, shape=output_shape, strides=strides) # 转为四维数组 four_d_array = windows.reshape(-1, 20, 20, 3)
补充说明
- 如果需要调整窗口滑动步长,只需修改
view_as_windows的step参数(或手动调整output_shape的计算逻辑),比如步长设为2时,子块数量会相应减少。 - 两种方法生成的四维数组,每个元素都是原图像上的20x20x3子块,顺序为从左到右、从上到下滑动得到的结果。
内容的提问来源于stack exchange,提问作者Skywalker
相关产品推荐
相关产品推荐

