You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 00:05:13