如何仅用numpy.lib.stride_tricks.as_strided实现im2Col操作?
可以仅用numpy.lib.stride_tricks.as_strided实现需求
完全可以用numpy.lib.stride_tricks.as_strided来实现,而且这种方式直接基于数组步长创建视图,不需要冗余数据复制,比你之前的实现快得多,代码也更简洁。
具体实现步骤
假设你的输入数组形状为(1,2,4,4),用2x2窗口在空间维度滑动(步长默认1),最终将每个位置的双通道窗口扁平化后拼接,代码如下:
import numpy as np # 构造示例输入数组:形状(1,2,4,4) arr = np.arange(1*2*4*4).reshape(1,2,4,4) # 窗口参数 win_h, win_w = 2, 2 stride_h, stride_w = 1, 1 batch, channels, h, w = arr.shape # 计算输出的空间维度 out_h = (h - win_h) // stride_h + 1 out_w = (w - win_w) // stride_w + 1 # 用as_strided创建滑动窗口视图 windowed = np.lib.stride_tricks.as_strided( arr, shape=(batch, out_h, out_w, channels, win_h, win_w), strides=( arr.strides[0], # batch维度步长 arr.strides[2] * stride_h, # 窗口行滑动步长 arr.strides[3] * stride_w, # 窗口列滑动步长 arr.strides[1], # 通道维度步长 arr.strides[2], # 窗口内部行步长 arr.strides[3] # 窗口内部列步长 ), writeable=False # 禁止写入,避免破坏原数组 ) # 将每个窗口扁平化(拼接双通道的2x2元素) result = windowed.reshape(batch, out_h, out_w, -1)
效果说明
- 最终
result的形状为(1,3,3,8):对应1个batch、3x3个窗口位置,每个位置是8个元素(2个通道各4个扁平化元素拼接)。 - 这种方式完全基于数组视图操作,没有额外的数据拷贝,执行效率远高于循环拼接等繁琐实现。
内容的提问来源于stack exchange,提问作者k200338 Mahad Hameed
相关产品推荐
相关产品推荐

