NumPy 2D数组高效块级修改:基于视图与查找表的策略


NumPy 2D数组高效块级修改:基于视图与查找表的策略

本教程旨在介绍如何利用numpy的`np.lib.stride_tricks.as_strided`功能,结合查找表机制,高效地对2d数组进行2x2块级别的修改。通过创建数组视图而非复制数据,并利用高级索引进行矢量化操作,此方法显著优于传统的python循环,极大提升了处理大型数据集的性能。

引言:Python循环的性能瓶颈

在处理大型NumPy数组时,如果需要对数组中的局部小块(例如2x2的子矩阵)进行模式识别和替换操作,传统的Python循环(如使用itertools.product遍历坐标)会因为解释器开销和逐元素操作而效率低下。NumPy的核心优势在于其矢量化操作,能够将循环操作推送到C语言层面执行,从而获得显著的性能提升。本教程的目标是展示如何采用NumPy原生的、矢量化的方式来高效地实现2D数组的2x2块级修改。

核心策略:利用NumPy视图与步幅技巧

实现高效块级操作的关键在于np.lib.stride_tricks.as_strided。这个函数允许我们创建一个现有NumPy数组的“视图”,而无需复制底层数据。通过巧妙地定义视图的shape(形状)和strides(步幅),我们可以将一个2D数组解释为一个由多个2x2块组成的更高维数组。对这个视图的修改会直接反映在原始数组上,从而避免了昂贵的数据复制操作。

理解 shape 和 strides 参数

  • shape: 新视图的形状。对于一个 (ny, nx) 的原始2D数组 A,如果我们要以 (2, 2) 的块进行操作,那么新的视图的形状将是 (ny//2, nx//2, 2, 2)。这表示视图包含 ny//2 行和 nx//2 列,每个“元素”本身又是一个 (2, 2) 的子数组。

  • strides: 定义了在内存中沿着某个维度移动一个单位所需的字节数。

    • 对于原始数组 A,其步幅为 A.strides = (row_stride, col_stride),其中 row_stride 是跳到下一行所需的字节数,col_stride 是跳到下一列所需的字节数。
    • 为了在视图中从一个2x2块的起始位置跳到下一个2x2块的起始位置(即视图的第一和第二个维度),我们需要在原始数组中跳过两行或两列。因此,视图的第一个维度(块行)步幅是 A.strides[0] * 2,第二个维度(块列)步幅是 A.strides[1] * 2。
    • 为了在视图内部的2x2块中移动(即视图的第三和第四个维度),我们需要按照原始数组的行和列步幅来移动。因此,视图的第三个维度(块内行)步幅是 A.strides[0],第四个维度(块内列)步幅是 A.strides[1]。
    • 综合起来,视图的步幅将是 (A.strides[0]*2, A.strides[1]*2, A.strides[0], A.strides[1])。

示例:创建2x2块视图

import numpy as np

# 示例数据:一个10x10的二进制数组
A = np.random.randint(0, 2, (10, 10))
print("原始数组 A:")
print(A)

# 计算视图的形状和步幅
ny, nx = A.shape
block_rows = ny // 2
block_cols = nx // 2

# 创建2x2块的视图
Av = np.lib.stride_tricks.as_strided(A,
                                     shape=(block_rows, block_cols, 2, 2),
                                     strides=(A.strides[0] * 2, A.strides[1] * 2,
                                              A.strides[0], A.strides[1]))
print("\n通过as_strided创建的2x2块视图 Av 的形状:", Av.shape)
print("Av[0,0] (原始数组A的第一个2x2块):\n", Av[0,0])

# 验证视图是否指向原始数据 (修改视图会影响原始数组)
# Av[0,0,0,0] = 99 # 修改视图的第一个元素
# print("\n修改Av[0,0,0,0]后,原始数组A的左上角:\n", A[:2,:2]) # 原始数组A也会随之改变

方法一:基于多维查找表的块替换

当每个2x2块的替换规则依赖于其内部的四个元素时,我们可以构建一个多维查找表(Lookup Table, LUT)。对于由布尔值(0或1)组成的2x2块,共有 2^4 = 16 种可能的状态。查找表将以前四个元素的值作为索引,存储对应的2x2替换块。

Copymatic Copymatic

Cowriter是一款AI写作工具,可以通过为你生成内容来帮助你加快写作速度和激发写作灵感。

Copymatic 149 查看详情 Copymatic

构建与应用查找表

查找表的形状将是 (2, 2, 2, 2, 2, 2),其中前四个 2 对应输入2x2块的四个元素 (0,0), (0,1), (1,0), (1,1) 的值,后两个 2 对应替换后的2x2块的形状。

# 示例查找表 (lut[val00, val01, val10, val11] = replacement_block)
# lut的形状为 (2,2,2,2, 2,2)
# 前四个2代表2x2块的四个元素 (0,0), (0,1), (1,0), (1,1) 的值
# 后两个2代表替换后的2x2块的形状
lut = np.zeros((2, 2, 2, 2, 2, 2), dtype=A.dtype)

# 填充一些转换规则。例如:
# 1. 原始块 [[0,0],[0,0]] 替换为 [[1,1],[1,1]]
lut[0, 0, 0, 0] = [[1, 1], [1, 1]]
# 2. 原始块 [[0,0],[0,1]] 替换为 [[1,1],[1,0]]
lut[0, 0, 0, 1] = [[1, 1], [1, 0]]
# 3. 原始块 [[0,1],[0,0]] 替换为 [[1,1],[0,1]]
lut[0, 1, 0, 0] = [[1, 1], [0, 1]]
# 4. 原始块 [[1,1],[0,0]] 替换为 [[1,1],[1,1]]
lut[1, 1, 0, 0] = [[1, 1], [1, 1]]
# ... 可以根据需要填充所有16种情况

# 应用查找表进行块替换
# 使用高级索引,将Av中的每个2x2块的四个元素作为lut的索引
Av[:] = lut[Av[..., 0, 0], Av[..., 0, 1], Av[..., 1, 0], Av[..., 1, 1]]

print("\n方法一:使用多维查找表后的数组 A:")
print(A)

方法二:基于一维查找表与索引转换的块替换

为了简化查找表的索引,我们可以将每个2x2块的四个布尔值转换为一个单一的整数索引(0-15)。这可以通过为每个位置分配一个权重并求和来实现。这种方法可以使查找表更紧凑,并可能简化索引逻辑。

索引转换与一维查找表

我们可以定义一个权重矩阵,例如:

[[8, 4],
 [2, 1]]

对于一个2x2块 [[v00, v01], [v10, v11]],其对应的单一索引将是 v00*8 + v01*4 + v10*2 + v11*1。这个索引的范围是0到15。

# 重新初始化数组A进行演示
A = np.random.randint(0, 2, (10, 10))
ny, nx = A.shape
block_rows = ny // 2
block_cols = nx // 2
Av = np.lib.stride_tricks.as_strided(A,
                                     shape=(block_rows, block_cols, 2, 2),
                                     strides=(A.strides[0] * 2, A.strides[1] * 2,
                                              A.strides[0], A.strides[1]))
print("\n重新初始化后的原始数组 A:")
print(A)

# 示例一维查找表 (lut2[index] = replacement_block)
lut2 = np.zeros((16, 2, 2), dtype=A.dtype)

# 填充一些转换规则。例如:
# 索引0 (对应原始块 [[0,0],[0,0]]) 替换为 [[1,1],[1,1]]
lut2[0] = [[1, 1], [1, 1]]
# 索引1 (对应原始块 [[0,0],[0,1]]) 替换为 [[1,1

以上就是NumPy 2D数组高效块级修改:基于视图与查找表的策略的详细内容,更多请关注其它相关文章!


# 于其  # 淮安全网营销推广  # 作网站推广的方法  # 孝感网站建设优化推广  # 西湖新媒体营销推广  # 渝中seo优化公司服务  # 公司网站建设规则  # 关于网站建设质量确认  # 河南获客软件推广营销  # 景区门票营销推广文案  # 企业官方网站的推广方案  # 矢量化  # python  # 第二个  # 浮点  # 跳到  # 所需  # 第一个  # 将是  # 我们可以  # 多维  # 性能瓶颈  # 字节  # c语言 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: 如何自定义苹果手机铃声  酷狗音乐多音轨设置教程  喜茶GO更换登录账号方法  顺丰快递怎么查物流_顺丰快递物流信息实时查询操作指南  《海豚家》注销账号方法  PHP utf8_encode 字符编码转换疑难解析与最佳实践  圆通快递包裹轨迹查询 圆通速递快件实时位置跟踪  太平年在哪个平台播出  折叠屏手机充不进电是什么问题? 特殊结构带来的维修难点  多闪电脑版下载_多闪PC端模拟器使用  HTML Canvas文本样式定制指南:解决外部字体加载与应用难题  2025考研成绩查询时间入口分享  iPhone 14 Pro如何更改区域设置_iPhone 14 Pro地区语言修改教程  cad视图选项卡不见了怎么办_cad视图标签恢复显示方法  虫虫漫画绿色安全入口_虫虫漫画绿色安全入口安全看漫画  Flexbox布局中Stencil组件宽度不显示问题解析与:host尺寸控制  《KARDS》冬季扩展包“国土阵线”上线!全新“协力”机制改变战场格局  FullCalendar自定义按钮样式定制指南  Dash应用中自定义HTML页面标题与网站图标(F*icon)的实用指南  Python中安全地将环境变量转换为整数的类型注解指南  谷歌浏览器官网地址整理_谷歌浏览器新版直连2026稳定访问  高效调试PHP大型嵌套数组:JSON序列化与可视化工具实践  如何在CSS中使用伪类选择器_hover实现悬停效果  Python对象引用与属性赋值:理解链表中的行为  windows10怎么开启wsl_windows10安装linux子系统教程  天堂漫画网页版在线阅读 天堂漫画手机版入口  什么是Satis,如何用它搭建一个私有的composer仓库?  在PHP环境中正确加载HTML资源:CSS样式与图片路径指南  火狐浏览器无法自动更新怎么办 手动更新火狐浏览器到最新版本【解决】  《顺丰同城骑士》查看我的技能方法  研招网官方网站正版登录网址_中国研究生招生信息网官网首页  漫蛙漫画官方版直通入口 2025漫蛙漫画免注册访问说明  Cassandra中复合主键、二级索引与ORDER BY排序的限制与解决方案  J*aScript事件处理:优化键盘输入与表单提交的实践指南  AO3中文入口稳定分享_AO3官网HTTPS看文详解  使用VS Code调试Python代码:从入门到精通  BunnyStream TUS视频上传指南:解决401认证错误与参数配置  一点万象签到领积分指南  《饿了么》拼好饭点外卖教程2025  被称为海蜈蚣的海洋动物是  Flexbox布局:实现粘性导航与底部页脚的完美结合  苹果电脑如何快速截图并编辑 苹果电脑截屏标注快捷操作  Dash应用多值文本输入处理与类型转换教程  iPhone14开启Apple TV遥控设置  优酷官网登录入口电脑版 优酷官网网址入口  《猎聘》筛选猎头岗位方法  CSS如何在页面中引入重置样式_使用Normalize.css或Reset.css统一浏览器默认样式  Win11怎么录屏_Windows 11自带Xbox Game Bar录制视频  电脑没有声音了怎么办 电脑声音问题的全面排查与修复指南【详解】  百度小说看书时如何翻页_百度小说手动翻页与自动翻页设置 

 2025-11-06

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.