当前位置: 首页 > news >正文

【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

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

相关文章:

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

2.12 连续数组:为什么contiguous这么重要? 目录 #mermaid-svg-wxhozKbHdFIldAkj {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-wxhozKbHdFIldAkj .error-icon{fill:#552222;}#mermaid-svg-…...

在React中使用redux

一、首先安装两个插件 1.Redux Toolkit 2.react-redux 第一步:创建模块counterStore 第二步:在store的入口文件进行子模块的导入组合 第三步:在index.js中进行store的全局注入 第四步:在组件中进行使用 第五步:在组件中…...

lstm预测

import numpy as np import pandas as pd import tensorflow as tf import math import matplotlib.pyplot as plt from sklearn.preprocessing import MinMaxScaler from keras.layers import LSTM,Activation,Dense,Dropout# 时间序列数据转换为监督学习的格式 def creatXY(d…...

《 C++ 点滴漫谈: 二十五 》空指针,隐秘而危险的杀手:程序崩溃的真凶就在你眼前!

摘要 本博客全面解析了 C 中指针与空值的相关知识,从基础概念到现代 C 的改进展开,涵盖了空指针的定义、表示方式、使用场景以及常见注意事项。同时,深入探讨了 nullptr 的引入及智能指针在提升代码安全性和简化内存管理方面的优势。通过实际…...

【AI】探索自然语言处理(NLP):从基础到前沿技术及代码实践

Hi ! 云边有个稻草人-CSDN博客 必须有为成功付出代价的决心,然后想办法付出这个代价。 目录 引言 1. 什么是自然语言处理(NLP)? 2. NLP的基础技术 2.1 词袋模型(Bag-of-Words,BoW&#xff…...

2025年Android开发趋势全景解读

文章目录 一、界面开发:从"手写代码"到"智能拼装"1.1 Jetpack Compose实战进化1.2 淘汰XML布局的三大信号 二、AI融合开发:无需炼丹的普惠智能2.1 设备端AI三大杀手级应用2.2 成本对比:设备端VS云端AI 三、跨平台演进&am…...

C#面试常考随笔11:Dictionary<K, V>、Hashtable的内部实现原理是什么?效率如何?

Dictionary<K, V> 底层数据结构&#xff1a;使用哈希表&#xff08;Hash Table&#xff09;&#xff0c;由一个数组和链表&#xff08;或在.NET Core 2.1 及之后版本中&#xff0c;当链表长度达到一定阈值时转换为红黑树&#xff09;组成。数组中的每个元素称为一个桶&a…...

Linux防火墙基础

一、Linux防火墙的状态机制 1.iptables是可以配置有状态的防火墙&#xff0c;其有状态的特点是能够指定并记住发送或者接收信息包所建立的连接状态&#xff0c;其一共有四种状态&#xff0c;分别为established invalid new related。 established:该信息包已建立连接&#x…...

Qt u盘自动升级软件

Qt u盘自动升级软件 Chapter1 Qt u盘自动升级软件u盘自动升级软件思路&#xff1a;step1. 获取U盘 判断U盘名字是否正确&#xff0c; 升级文件是否存在。step2. 升级step3. 升级界面 Chapter2 Qt 嵌入式设备应用程序&#xff0c;通过U盘升级的一种思路Chapter3 在开发板上运行的…...

【Conda 和 虚拟环境详细指南】

Conda 和 虚拟环境的详细指南 什么是 Conda&#xff1f; Conda 是一个开源的包管理和环境管理系统&#xff0c;支持多种编程语言&#xff08;如Python、R等&#xff09;&#xff0c;最初由Continuum Analytics开发。 主要功能&#xff1a; 包管理&#xff1a;安装、更新、删…...

Python递归函数深度解析:从原理到实战

Python递归函数深度解析&#xff1a;从原理到实战 递归是计算机科学中重要的编程范式&#xff0c;也是算法设计的核心思想之一。本文将通过20实战案例&#xff0c;带你深入理解Python递归函数的精髓&#xff0c;掌握递归算法的实现技巧。 一、递归函数核心原理 1.1 递归三要…...

OpenGL学习笔记(五):Textures 纹理

文章目录 纹理坐标纹理环绕方式纹理过滤——处理纹理分辨率低的情况多级渐远纹理Mipmap——处理纹理分辨率高的情况加载与创建纹理 &#xff08; <stb_image.h> &#xff09;生成纹理应用纹理纹理单元练习1练习2练习3练习4 通过上一篇着色部分的学习&#xff0c;我们可以…...

【TypeScript】基础:数据类型

文章目录 TypeScript一、简介二、类型声明三、数据类型anyunknownnervervoidobjecttupleenumType一些特殊情况 TypeScript 是JavaScript的超集&#xff0c;代码量比JavaScript复杂、繁多&#xff1b;但是结构更清晰 一、简介 为什么需要TypeScript&#xff1f; JavaScript的…...

Notepad++消除生成bak文件

设置(T) ⇒ 首选项... ⇒ 备份 ⇒ 勾选 "禁用" 勾选禁用 就不会再生成bak文件了 notepad怎么修改字符集编码格式为gbk 如图所示...

Android NDK

Android NDK环境 D:\Android SDK\ndk\25.2.9519653 使用clang而不用gcc D:\Android SDK\ndk\25.1.8937393\toolchains\llvm\prebuilt\windows-x86_64\bin\clang --version 查看是否安装成功clang ptrace 在 C 语言中&#xff0c;ptrace 已经被 Linux 内核实现&#xff0…...

内部知识库助力组织智力激发与信息共享实现业绩增长

内容概要 内部知识库是企业知识管理的核心组件&#xff0c;具有不可估量的重要性。通过构建有效的知识库&#xff0c;组织能够将孤立的知识和信息整合成为一个系统性的体&#xff0c;极大提高员工访问和利用这些信息的能力。这不仅简化了决策过程&#xff0c;还通过减少重复劳…...

通过F12收集的信息

按 F12 键打开浏览器的开发者工具&#xff08;DevTools&#xff09;可以获取部分操作系统和中间件信息&#xff0c;但能力有限。以下是具体说明&#xff1a; 一、通过 F12 收集的信息 1. 客户端操作系统信息 - Console 控制台 通过 JavaScript 直接获取客户端操作系统信息&am…...

用Python替代OpenMV IDE显示openmv USB 图像

原理是利用openmv的usb模仿串口&#xff0c;然后用Python代码打开串口接收 能替代openmv ide 跑48帧图像 Python端需要的依赖&#xff1a; 需要的是&#xff1a; from ultralytics import YOLO import cv2 import numpy as np from serial import Serial import time from co…...

c语言:编译和链接(详解)

前言 要将编译和链接&#xff0c;就不得不提及编译器是如何运作的&#xff0c;虽然这部分知识是针对于要创造编译器和创作语言的人所需要清楚的&#xff0c;但作为c语言的学习者也需要了解一下&#xff0c;修炼内功&#xff0c;尤其是对于想学习c的人而言。 编译器的运作过程…...

数据结构【单链表操作大全详解】【c语言版】(只有输入输出为了方便用的c++)

单链表操作的C/C实现详解 在数据结构中&#xff0c;单链表是一种非常基础且重要的数据结构。它由一系列节点组成&#xff0c;每个节点包含数据和指向下一个节点的指针。今天我们就来深入探讨用C/C实现的单链表及其各种操作。 一、单链表的定义 const int N 1e5; //单链表 t…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…...

论文阅读:Matting by Generation

今天介绍一篇关于 matting 抠图的文章&#xff0c;抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法&#xff0c;已经有很多的工作和这个任务相关。这两年 diffusion 模型很火&#xff0c;大家又开始用 diffusion 模型做各种 CV 任务了&am…...

对象回调初步研究

_OBJECT_TYPE结构分析 在介绍什么是对象回调前&#xff0c;首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例&#xff0c;用_OBJECT_TYPE这个结构来解析它&#xff0c;0x80处就是今天要介绍的回调链表&#xff0c;但是先不着急&#xff0c;先把目光…...

PH热榜 | 2025-06-08

1. Thiings 标语&#xff1a;一套超过1900个免费AI生成的3D图标集合 介绍&#xff1a;Thiings是一个不断扩展的免费AI生成3D图标库&#xff0c;目前已有超过1900个图标。你可以按照主题浏览&#xff0c;生成自己的图标&#xff0c;或者下载整个图标集。所有图标都可以在个人或…...

ABB馈线保护 REJ601 BD446NN1XG

配电网基本量程数字继电器 REJ601是一种专用馈线保护继电器&#xff0c;用于保护一次和二次配电网络中的公用事业和工业电力系统。该继电器在一个单元中提供了保护和监控功能的优化组合&#xff0c;具有同类产品中最佳的性能和可用性。 REJ601是一种专用馈线保护继电器&#xf…...