【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.12 连续数组:为什么contiguous这么重要?

在这里插入图片描述

2.12 连续数组:为什么contiguous这么重要?

目录
《连续数组:为什么contiguous这么重要?》
2.12.1 C顺序与Fortran顺序对比
2.12.2 跨步数组重排
2.12.3 BLAS库兼容性
2.12.4 转置操作性能对比
2.12.5 总结
2.12.6 参考文献

2.12.1 C顺序与Fortran顺序对比

NumPy 的 ndarray 支持两种主要的内存顺序:C 顺序(行优先)和 Fortran 顺序(列优先)。了解这两种顺序的差异和影响对于优化内存访问至关重要。

  • C 顺序的基本原理:行优先存储。
  • Fortran 顺序的基本原理:列优先存储。
  • 选择合适的顺序:在不同场景下选择合适的内存顺序。
内存顺序对比
C 顺序
Fortran 顺序
行优先存储
列优先存储
选择合适的顺序
矩阵乘法
数组切片
import numpy as np# 创建一个 C 顺序的数组
a_c = np.array([[1, 2, 3], [4, 5, 6]], order='C')
print(f"C 顺序数组 a_c: \n{a_c}")
print(f"a_c 的步长: {a_c.strides}")  # 输出步长# 创建一个 Fortran 顺序的数组
a_f = np.array([[1, 2, 3], [4, 5, 6]], order='F')
print(f"Fortran 顺序数组 a_f: \n{a_f}")
print(f"a_f 的步长: {a_f.strides}")  # 输出步长

2.12.2 跨步数组重排

跨步(strides)是 ndarray 中非常重要的概念,通过调整步长可以实现数组的重排,而不需要创建新的数据副本。合理的跨步设置可以显著提高性能。

  • 跨步的基本概念:步长的定义和作用。
  • 跨步重排的方法:如何通过调整步长实现数组重排。
  • 跨步重排的性能优势:避免数据复制,提高访问效率。
通过 reshape 方法调整步长
ndarray
+int nd: 维度数
+npy_intp* dimensions: 形状数组
+npy_intp* strides: 步长数组
+void* data: 数据指针
+PyDataTypeObject* dtype: 数据类型
+PyObject* base: 基数组
+int flags: 标志位
reshape
+ndarray* _array: 原始数组
+npy_intp* _new_strides: 新的步长数组
+int _new_flags: 新的标志位
import numpy as np# 创建一个 3x3 的数组
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])# 通过重塑实现跨步重排
b = a.reshape(9)  # 将 3x3 的数组重塑为 1x9 的数组
print(f"重塑后的数组 b: \n{b}")
print(f"b 的步长: {b.strides}")  # 输出步长# 通过转置实现跨步重排
c = a.T  # 转置数组
print(f"转置后的数组 c: \n{c}")
print(f"c 的步长: {c.strides}")  # 输出步长

2.12.3 BLAS库兼容性

BLAS(Basic Linear Algebra Subprograms)库是许多数值计算库的核心,NumPy 也依赖于 BLAS 库来实现高效的矩阵运算。了解 ndarray 的连续性对 BLAS 库的兼容性影响可以优化计算性能。

  • BLAS库的基本原理:BLAS 库的介绍和作用。
  • 连续性对 BLAS 的影响:非连续数组对 BLAS 库性能的影响。
  • 优化 BLAS 兼容性:如何确保数组的连续性以优化 BLAS 性能。
BLAS库兼容性
BLAS库的基本原理
矩阵运算优化
线性代数操作
连续性对 BLAS 的影响
性能下降
数据复制
优化 BLAS 兼容性
使用 np.ascontiguousarray
转置数组
import numpy as np
import time# 创建一个大数组
a = np.random.rand(1000, 1000)# 非连续数组
b = a[::2, ::2]  # 非连续数组# 连续数组
c = np.ascontiguousarray(b)  # 转换为连续数组# 计算矩阵乘法
start_time = time.time()
result_b = np.dot(b, b.T)  # 非连续数组的矩阵乘法
non_contiguous_time = time.time() - start_time
print(f"非连续数组矩阵乘法用时: {non_contiguous_time:.2f}秒")start_time = time.time()
result_c = np.dot(c, c.T)  # 连续数组的矩阵乘法
contiguous_time = time.time() - start_time
print(f"连续数组矩阵乘法用时: {contiguous_time:.2f}秒")# 比较性能
speedup = non_contiguous_time / contiguous_time
print(f"连续数组矩阵乘法性能提升: {speedup:.2f}倍")

2.12.4 转置操作性能对比

转置操作在数组处理中非常常见,但不同的数组顺序(如 C 顺序和 Fortran 顺序)会影响转置的性能。了解转置操作的性能差异可以优化代码。

  • 转置的基本原理:转置操作的定义和作用。
  • C 顺序和 Fortran 顺序的转置性能:比较两种顺序的转置性能。
  • 优化转置操作:如何优化转置操作以提高性能。
转置操作性能对比
转置的基本原理
改变数组顺序
C 顺序的转置性能
数据复制
步长调整
Fortran 顺序的转置性能
数据不复制
步长调整
优化转置操作
使用 np.asfortranarray
使用 np.ascontiguousarray
import numpy as np
import time# 创建一个 C 顺序的数组
a_c = np.random.rand(1000, 1000)# 创建一个 Fortran 顺序的数组
a_f = np.asfortranarray(a_c)# 计算 C 顺序数组的转置
start_time = time.time()
b_c = a_c.T  # 转置操作
c contiguous_time = time.time() - start_time
print(f"C 顺序数组转置用时: {c_contiguous_time:.2f}秒")
print(f"b_c 的步长: {b_c.strides}")  # 输出步长# 计算 Fortran 顺序数组的转置
start_time = time.time()
b_f = a_f.T  # 转置操作
f_contiguous_time = time.time() - start_time
print(f"Fortran 顺序数组转置用时: {f_contiguous_time:.2f}秒")
print(f"b_f 的步长: {b_f.strides}")  # 输出步长# 比较性能
speedup = c_contiguous_time / f_contiguous_time
print(f"Fortran 顺序数组转置性能提升: {speedup:.2f}倍")

2.12.5 总结

  • 关键收获:理解 C 顺序和 Fortran 顺序的差异,掌握跨步数组重排的方法,了解 BLAS 库兼容性的重要性,优化转置操作的性能。
  • 最佳实践:合理选择内存顺序,优化数组的跨步设置,确保数组的连续性以提高计算性能,使用 np.ascontiguousarraynp.asfortranarray 进行内存优化。
  • 实用技巧:通过实时监控内存占用和性能测试,找到最优的内存布局策略。

通过本文,我们深入探讨了 NumPy 中连续数组的重要性,包括 C 顺序和 Fortran 顺序的对比,跨步数组的重排技巧,BLAS 库的兼容性问题,以及转置操作的性能优化。希望这些内容能帮助你在实际开发中更好地优化内存使用,提高代码性能,避免常见的内存陷阱。

2.12.6 参考文献

参考资料链接
《NumPy Beginner’s Guide》NumPy Beginner’s Guide
《Python for Data Analysis》Python for Data Analysis
NumPy 官方文档NumPy Reference
Dask 官方文档Dask Documentation
Stack OverflowDifference between C and Fortran order in NumPy
MediumUnderstanding NumPy’s Memory Layout
Python Memory ManagementPython Memory Management
SciPy 官方文档SciPy Memory Efficiency
WikipediaBLAS (Basic Linear Algebra Subprograms)
《高性能Python》High Performance Python
《Python数据科学手册》Python Data Science Handbook
Intel MKLIntel Math Kernel Library (MKL)
OpenBLASOpenBLAS Documentation

这篇文章包含了详细的原理介绍、代码示例、源码注释以及案例等。希望这对您有帮助。如果有任何问题请随私信或评论告诉我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/11473.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络】3.HTTP(讲解HTTP协议和写HTTP服务)

目录 1 认识URL1.1 URI的格式 2 HTTP协议2.1 请求报文2.2 响应报文 3 模拟HTTP3.1 Socket.hpp3.2 HttpServer.hpp3.2.1 start()3.2.2 ThreadRun()3.2.3 HandlerHttp() 总结 1 认识URL 什么是URI? URI 是 Uniform Resource Identifier的缩写&…

力扣第149场双周赛

文章目录 题目总览题目详解找到字符串中合法的相邻数字重新安排会议得到最多空余时间I3440.重新安排会议得到最多空余时间II 第149场双周赛 题目总览 找到字符串中合法的相邻数字 重新安排会议得到最多空余时间I 重新安排会议得到最多空余时间II 变成好标题的最少代价 题目…

HTB:Alert[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用ffuf对alert.htb域名进行子域名FUZZ 使用go…

96,【4】 buuctf web [BJDCTF2020]EzPHP

进入靶场 查看源代码 GFXEIM3YFZYGQ4A 一看就是编码后的 1nD3x.php 访问 得到源代码 <?php // 高亮显示当前 PHP 文件的源代码&#xff0c;用于调试或展示代码结构 highlight_file(__FILE__); // 关闭所有 PHP 错误报告&#xff0c;防止错误信息泄露可能的安全漏洞 erro…

吴恩达深度学习——有效运作神经网络

内容来自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;仅为本人学习所用。 文章目录 训练集、验证集、测试集偏差、方差正则化正则化参数为什么正则化可以减少过拟合Dropout正则化Inverted Dropout其他的正则化方法数据增广Early stopping 归一化梯度消失与梯度爆…

【xdoj-离散线上练习】T251(C++)

解题反思&#xff1a; 开始敲代码前想清楚整个思路比什么都重要嘤嘤嘤&#xff01;看到输入m, n和矩阵&#xff0c;注意不能想当然地认为就是高m&#xff0c;宽n的矩阵&#xff0c;细看含义 比如本题给出了树的邻接矩阵&#xff0c;就是n*n的&#xff0c;代码实现中没有用到m这…

deep seek R1本地化部署及openAI API调用

先说几句题外话。 最近deep seek火遍全球&#xff0c;所以春节假期期间趁着官网优惠充值了deep seek的API&#xff0c;用openAI的接口方式尝试了下对deep seek的调用&#xff0c;并且做了个简单测试&#xff0c;测试内容确实非常简单&#xff1a;通过prompt提示词让大模型对用…

01.双Android容器解决方案

目录 写在前面 一&#xff0c;容器 1.1 容器的原理 1.1.1 Namespace 1.1.2 Cgroups&#xff08;Control Groups&#xff09; 1.1.3 联合文件系统&#xff08;Union File System&#xff09; 1.2 容器的应用 1.2.1 微服务架构 1.2.2 持续集成和持续部署&#xff08;CI/…

Python 绘图工具详解:使用 Matplotlib、Seaborn 和 Pyecharts 绘制散点图

目录 数据可视化1.使用 matplotlib 库matplotlib 库 2 .使用 seaborn 库seaborn 库 3 .使用 pyecharts库pyecharts库 注意1. 确保安装了所有必要的库2. 检查Jupyter Notebook的版本3. 使用render()方法保存为HTML文件4. 使用IFrame在Notebook中显示HTML文件5. 检查是否有其他输…

无人机集群新年祝福表演技术原理详解

无人机集群新年祝福表演技术是一项集飞行控制技术、智能协调和精密控制于一体的高科技表演形式。其技术原理主要涉及无人机硬件设备、软件系统以及表演协调等多个方面。以下是对该技术原理的详细解析&#xff1a; 一、无人机硬件设备 无人机集群表演的核心是无人机本身&#x…

贪吃蛇实现

1.资料来源 https://learn.microsoft.com/zh-cn/windows/console/getstdhandle 2.前言 简介 贪吃蛇是久负盛名的游戏&#xff0c;和俄罗斯方块、扫雷等游戏位列于经典游戏的行列。 《贪食蛇》中玩家控制一条不断移动的蛇&#xff0c;在屏幕上吃掉出现的食物。每吃掉一个食物…

计算机毕业设计Python动漫推荐系统 漫画推荐系统 动漫视频推荐系统 机器学习 bilibili动漫爬虫 数据可视化 数据分析 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

MyBatis-Plus笔记-快速入门

大家在日常开发中应该能发现&#xff0c;单表的CRUD功能代码重复度很高&#xff0c;也没有什么难度。而这部分代码量往往比较大&#xff0c;开发起来比较费时。 因此&#xff0c;目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的一个组件就是…

《OpenCV》——图像透视转换

图像透视转换简介 在 OpenCV 里&#xff0c;图像透视转换属于重要的几何变换&#xff0c;也被叫做投影变换。下面从原理、实现步骤、相关函数和应用场景几个方面为你详细介绍。 原理 实现步骤 选取对应点&#xff1a;要在源图像和目标图像上分别找出至少四个对应的点。这些对…

克隆OpenAI(基于openai API和streamlit)

utils.py&#xff1a; from langchain_openai import ChatOpenAI from langchain.memory import ConversationBufferMemory from langchain.chains import ConversationChain import osdef get_chat_response(api_key,prompt,memory): # memory不能是函数的内部局部变量&…

用 HTML、CSS 和 JavaScript 实现抽奖转盘效果

顺序抽奖 前言 这段代码实现了一个简单的抽奖转盘效果。页面上有一个九宫格布局的抽奖区域&#xff0c;周围八个格子分别放置了不同的奖品名称&#xff0c;中间是一个 “开始抽奖” 的按钮。点击按钮后&#xff0c;抽奖区域的格子会快速滚动&#xff0c;颜色不断变化&#xf…

【Linux】使用管道实现一个简易版本的进程池

文章目录 使用管道实现一个简易版本的进程池流程图代码makefileTask.hppProcessPool.cc 程序流程&#xff1a; 使用管道实现一个简易版本的进程池 流程图 代码 makefile ProcessPool:ProcessPool.ccg -o $ $^ -g -stdc11 .PHONY:clean clean:rm -f ProcessPoolTask.hpp #pr…

Elasticsearch的索引生命周期管理

目录 说明零、参考一、ILM的基本概念二、ILM的实践步骤Elasticsearch ILM策略中的“最小年龄”是如何计算的&#xff1f;如何监控和调整Elasticsearch ILM策略的性能&#xff1f; 1. **监控性能**使用/_cat/thread_pool API基本请求格式请求特定线程池的信息响应内容 2. **调整…

MQTT知识

MQTT协议 MQTT 是一种基于发布/订阅模式的轻量级消息传输协议&#xff0c;专门针对低带宽和不稳定网络环境的物联网应用而设计&#xff0c;可以用极少的代码为联网设备提供实时可靠的消息服务。MQTT 协议广泛应用于物联网、移动互联网、智能硬件、车联网、智慧城市、远程医疗、…

LabVIEW如何高频采集温度数据?

在LabVIEW中进行高频温度数据采集时&#xff0c;选择合适的传感器&#xff08;如热电偶或热电阻&#xff09;和采集硬件是关键。下面是一些建议&#xff0c;帮助实现高效的温度数据采集&#xff1a; 1. 传感器选择&#xff1a; 热电偶&#xff08;Thermocouple&#xff09;&am…