0

0

numpy 如何用 np.lib.stride_tricks.as_strided 实现零拷贝视图

冰川箭仙

冰川箭仙

发布时间:2026-01-24 18:42:09

|

760人浏览过

|

来源于php中文网

原创

as_strided的核心原理是零拷贝内存重解释:通过新shape、strides和offset直接映射原数组内存,要求总字节数≤原nbytes且strides以字节为单位;需手动保证安全,推荐writeable=False。

numpy 如何用 np.lib.stride_tricks.as_strided 实现零拷贝视图

as_strided 的核心原理:绕过内存复制,直接重解释指针

它不创建新数组,只是用新的 shape、strides 和 offset 去“重新读取”原数组的内存块。只要新视图的内存访问范围完全落在原数组的连续内存内,就是安全的零拷贝;一旦越界或 stride 设错,就会读到脏数据甚至 segfault —— as_strided 不做边界检查,全靠你手动保证。

  • 必须确保 shape × 对应 strides 所覆盖的总字节数 ≤ 原数组 nbytes
  • strides 单位是字节,不是元素个数:比如 arr.dtype == np.float64(8 字节),则跨 1 行的 stride 应为 8 * arr.shape[1],不是 arr.shape[1]
  • 推荐配合 writeable=False 创建只读视图,避免意外修改底层内存引发未定义行为

滑动窗口(rolling window)的经典用法

这是最常用也最容易出错的场景。例如把一维数组 a = np.arange(10) 变成每 3 个元素一组、步长为 1 的窗口:[[0,1,2], [1,2,3], ..., [7,8,9]],形状应为 (8, 3)

from numpy.lib.stride_tricks import as_strided
a = np.arange(10)
win_size = 3
shape = (len(a) - win_size + 1, win_size)
strides = (a.strides[0], a.strides[0])  # 每行起始地址差 1 个元素(字节),列内也是 1 元素步长
windows = as_strided(a, shape=shape, strides=strides, writeable=False)

注意:strides 不能写成 (1, 1) —— 这是字节单位错误;也不能写成 (a.itemsize, a.itemsize) 而不乘维度,因为 a.strides[0] 已经是字节跨度,直接复用最安全。

二维图像 patch 提取:避免 reshape + loop

对图像 img(如 (64, 64))提取 (16, 16) 大小、无重叠的 patches,目标 shape 是 (4, 4, 16, 16)(即 4×4 个 patch)。

墨鱼aigc
墨鱼aigc

一款超好用的Ai写作工具,为用户提供一键生成营销广告、原创文案、写作辅助等文字生成服务。

下载
  • img.strides(64 * img.itemsize, img.itemsize)
  • 新视图在 patch 行/列方向的 stride 应为 16 * img.strides[0]16 * img.strides[1]
  • patch 内部 stride 不变:img.strides
h, w = img.shape
ph, pw = 16, 16
shape = (h//ph, w//pw, ph, pw)
strides = (ph * img.strides[0], pw * img.strides[1], img.strides[0], img.strides[1])
patches = as_strided(img, shape=shape, strides=strides, writeable=False)

如果想支持重叠 patch(如步长=8),只需把 strides 中前两个分量改为 8 * img.strides[0]8 * img.strides[1],并相应调整 shape

为什么不用 sliding_window_view?

np.sliding_window_view(v1.20+)本质就是封装了 as_strided,但它做了安全校验、自动推导 stride,并返回可写视图(底层仍零拷贝)。如果你用的是旧 NumPy 或需要极致控制(比如自定义非均匀 stride),才需手写 as_strided;否则优先用 sliding_window_view —— 它更安全、语义清晰,且同样零拷贝。

真正容易被忽略的是:即使零拷贝,视图仍共享原数组内存;若原数组被 del 或超出作用域,视图会变成悬空指针,读取结果不可预测 —— 所以务必确保源数组生命周期 ≥ 视图使用期。

相关专题

更多
空指针异常处理
空指针异常处理

本专题整合了空指针异常解决方法,阅读专题下面的文章了解更多详细内容。

22

2025.11.16

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

25

2026.01.23

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

31

2026.01.23

yy漫画官方登录入口地址合集
yy漫画官方登录入口地址合集

本专题整合了yy漫画入口相关合集,阅读专题下面的文章了解更多详细内容。

119

2026.01.23

漫蛙最新入口地址汇总2026
漫蛙最新入口地址汇总2026

本专题整合了漫蛙最新入口地址大全,阅读专题下面的文章了解更多详细内容。

180

2026.01.23

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

16

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

70

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

63

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

64

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.7万人学习

Excel 教程
Excel 教程

共162课时 | 13.2万人学习

PHP基础入门课程
PHP基础入门课程

共33课时 | 2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号