【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.22 形状操控者:转置与轴交换的奥秘

1.22 形状操控者:转置与轴交换的奥秘
目录
- 引言
- 内存布局对转置性能的影响
- 爱因斯坦求和约定实践
- 高维张量轴交换可视化
- 矩阵运算的几何解释
- 总结
- 参考文献
1.22.1 引言
在数据科学和机器学习中,数组的形状操作是一项基本但重要的任务。本文将详细介绍NumPy中转置与轴交换的原理和应用,包括内存布局对性能的影响、爱因斯坦求和约定的实践、高维张量轴交换的可视化以及矩阵运算的几何解释。
1.22.2 内存布局对转置性能的影响
1.22.2.1 内存布局的基本原理
内存布局指的是数组在内存中的存储方式。NumPy数组默认使用C语言的内存布局,即行优先存储。转置操作会改变数组的内存布局,从而影响性能。
1.22.2.1.1 行优先存储 vs 列优先存储
graph TDA[NumPy数组内存布局]A --> B[行优先存储 (C语言)]A --> C[列优先存储 (Fortran)]B --> D[内存连续]C --> E[内存不连续]
1.22.2.2 转置操作的内存地址验证实验
1.22.2.2.1 代码示例
import numpy as np# 创建一个2D数组
data = np.array([[1, 2, 3], [4, 5, 6]], order='C') # 使用行优先存储# 打印原始数组及其内存地址
print("原始数组:")
print(data)
print("内存地址:")
for i in range(data.shape[0]):for j in range(data.shape[1]):print(f"({i}, {j}): {data[i, j]} - {data[i, j].__array_interface__['data'][0]}")# 转置数组
data_t = data.T # 转置操作# 打印转置后的数组及其内存地址
print("转置后的数组:")
print(data_t)
print("内存地址:")
for i in range(data_t.shape[0]):for j in range(data_t.shape[1]):print(f"({i}, {j}): {data_t[i, j]} - {data_t[i, j].__array_interface__['data'][0]}")
1.22.2.3 转置操作的性能测试
1.22.2.3.1 代码示例
import numpy as np
import time# 生成大规模2D数组
data = np.random.randn(10000, 10000) # 生成10000x10000的随机数据# 测试转置操作
start_time = time.time()
data_t = data.T # 转置操作
end_time = time.time()
time_transpose = end_time - start_time
print(f"转置操作时间: {time_transpose:.6f}秒")# 测试内存连续的转置操作
start_time = time.time()
data_t_contiguous = np.ascontiguousarray(data.T) # 转置后内存连续
end_time = time.time()
time_contiguous_transpose = end_time - start_time
print(f"内存连续的转置操作时间: {time_contiguous_transpose:.6f}秒")# 生成结果图
import matplotlib.pyplot as pltplt.bar(['普通转置', '内存连续转置'], [time_transpose, time_contiguous_transpose])
plt.xlabel('方法')
plt.ylabel('时间(秒)')
plt.title('转置操作的性能对比')
plt.show()
1.22.3 爱因斯坦求和约定实践
爱因斯坦求和约定(Einstein summation convention)是一种简洁的方式,用于表示数组的多维操作。NumPy的einsum函数支持这种约定,可以高效地进行多维数组运算。
1.22.3.1 爱因斯坦求和约定的基本原理
爱因斯坦求和约定通过标签(标签可以是字母或下标)来表示数组的维度,并通过标签匹配来进行运算。例如,np.einsum('ij,jk->ik', A, B)表示矩阵乘法。
公式解释
I j k = ∑ i = 1 N m i ( δ j k r i 2 − r i j r i k ) I_{jk} = \sum_{i=1}^N m_i (\delta_{jk} r_i^2 - r_{ij} r_{ik}) Ijk=i=1∑Nmi(δjkri2−rijrik)
1.22.3.1.1 代码示例
import numpy as np# 创建两个2D数组
A = np.array([[1, 2], [3, 4]], dtype=np.float32)
B = np.array([[5, 6], [7, 8]], dtype=np.float32)# 使用np.einsum进行矩阵乘法
C = np.einsum('ij,jk->ik', A, B) # 矩阵乘法# 打印结果
print("矩阵A:")
print(A)
print("矩阵B:")
print(B)
print("乘积矩阵C:")
print(C)
1.22.3.2 爱因斯坦求和约定在物理仿真中的应用
1.22.3.2.1 代码示例
import numpy as np# 创建一个4D张量
tensor = np.random.randn(10, 10, 10, 10) # 生成10x10x10x10的随机张量# 使用np.einsum进行4D张量的操作
result = np.einsum('ijkl,jmno->imko', tensor, tensor) # 4D张量操作# 打印结果
print("4D张量操作结果:")
print(result)
1.22.4 高维张量轴交换可视化
在处理高维数据时,轴交换(axis swapping)是一项常见的操作。我们将通过动画演示来可视化4D张量的轴交换过程。
1.22.4.1 4D张量轴交换的动画演示
4D张量轴交换示意图
1.22.4.1.1 代码示例
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation# 创建一个4D张量
tensor = np.random.randn(10, 10, 10, 10) # 生成10x10x10x10的随机张量# 定义动画函数
def update(frame):# 选择一个3D切片slice_3d = tensor[frame, :, :, :] # 选择第frame个3D切片ax.clear()ax.voxels(slice_3d, edgecolor='k') # 绘制3D体数据ax.set_title(f'4D张量第{frame}个切片')# 创建动画
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ani = animation.FuncAnimation(fig, update, frames=range(10), interval=500, repeat=True)# 显示动画
plt.show()
1.22.5 矩阵运算的几何解释
矩阵运算在几何中有着丰富的解释,通过可视化可以更好地理解这些运算的几何意义。
1.22.5.1 矩阵旋转的几何变换实现
1.22.5.1.1 旋转矩阵的定义
旋转矩阵是一种特殊的正交矩阵,用于表示平面上的旋转操作。二维旋转矩阵的定义如下:
R ( θ ) = [ cos ( θ ) − sin ( θ ) sin ( θ ) cos ( θ ) ] R(\theta) = \begin{bmatrix} \cos(\theta) & -\sin(\theta) \\ \sin(\theta) & \cos(\theta) \end{bmatrix} R(θ)=[cos(θ)sin(θ)−sin(θ)cos(θ)]
1.22.5.1.2 代码示例
import numpy as np
import matplotlib.pyplot as plt# 定义旋转角度
theta = np.pi / 4 # 45度旋转# 创建旋转矩阵
R = np.array([[np.cos(theta), -np.sin(theta)],[np.sin(theta), np.cos(theta)]], dtype=np.float32)# 创建原始点
points = np.array([[1, 0], [0, 1], [-1, 0], [0, -1]], dtype=np.float32)# 旋转点
rotated_points = np.dot(points, R.T) # 点的旋转# 绘制结果
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.scatter(points[:, 0], points[:, 1], c='r', label='原始点')
plt.xlabel('x')
plt.ylabel('y')
plt.title('原始点')
plt.legend()
plt.grid(True)plt.subplot(1, 2, 2)
plt.scatter(rotated_points[:, 0], rotated_points[:, 1], c='b', label='旋转后的点')
plt.xlabel('x')
plt.ylabel('y')
plt.title('旋转后的点')
plt.legend()
plt.grid(True)plt.show()
1.22.6 转置在密码学中的应用案例
转置操作在密码学中有广泛的应用,尤其是在矩阵加密和解密中。我们将通过一个简单的案例来展示转置在密码学中的应用。
1.22.6.1 矩阵加密解密的案例
1.22.6.1.1 代码示例
import numpy as np# 创建一个3D数组作为密钥
key = np.random.randint(0, 256, (10, 10, 10), dtype=np.uint8)# 创建一个3D数组作为明文
plaintext = np.random.randint(0, 256, (10, 10, 10), dtype=np.uint8)# 加密操作
def encrypt(plaintext, key):encrypted = np.bitwise_xor(plaintext, key) # 逐元素异或操作return encrypted# 解密操作
def decrypt(ciphertext, key):decrypted = np.bitwise_xor(ciphertext, key) # 逐元素异或操作return decrypted# 加密
ciphertext = encrypt(plaintext, key)
print("密文:")
print(ciphertext)# 解密
decrypted = decrypt(ciphertext, key)
print("解密后的明文:")
print(decrypted)
1.22.7 总结
本文详细介绍了NumPy中转置与轴交换的原理和应用,包括内存布局对转置性能的影响、爱因斯坦求和约定的实践、高维张量轴交换的可视化、矩阵运算的几何解释以及转置在密码学中的应用案例。通过这些内容,希望读者能够更好地理解和应用NumPy的形状操控功能,从而在实际项目中提高数据处理和分析的效率。
1.22.8 参考文献
| 参考资料名 | 链接 |
|---|---|
| NumPy官方文档 | https://numpy.org/doc/stable/ |
| Matplotlib官方文档 | https://matplotlib.org/ |
| CuPy官方文档 | https://docs.cupy.dev/en/latest/ |
| 多进程并行处理 | https://docs.python.org/3/library/multiprocessing.html |
| Z分数计算 | https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.zscore.html |
| 爱因斯坦求和约定 | https://numpy.org/doc/stable/reference/generated/numpy.einsum.html |
| 4D张量轴交换动画演示 | https://matplotlib.org/stable/api/animation_api.html |
| 矩阵旋转的几何变换实现 | https://en.wikipedia.org/wiki/Rotation_matrix |
| 转置在密码学中的应用 | https://en.wikipedia.org/wiki/XOR_cipher |
| 大规模数据处理性能优化 | https://realpython.com/faster-numpy-arrays-cython/ |
| 数据可视化 | https://seaborn.pydata.org/ |
| 数据科学手册 | https://jakevdp.github.io/PythonDataScienceHandbook/ |
| 高维张量操作 | https://pytorch.org/docs/stable/tensor_view.html |
| GPU加速的Python库 | https://cupy.chainer.org/ |
| CUDA编程入门 | https://developer.nvidia.com/blog/getting-started-cuda-python/ |
这篇文章包含了详细的原理介绍、代码示例、源码注释以及案例等。希望这对您有帮助。如果有任何问题请随私信或评论告诉我。
相关文章:
【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.22 形状操控者:转置与轴交换的奥秘
1.22 形状操控者:转置与轴交换的奥秘 目录 #mermaid-svg-Qb3eoIWrPbPGRVAf {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Qb3eoIWrPbPGRVAf .error-icon{fill:#552222;}#mermaid-svg-Qb3eoIWrPbPGRVAf…...
NLP模型大对比:Transformer >Seq2Seq > LSTM > RNN > n-gram
结论 Transformer 大于 传统的Seq2Seq 大于 LSTM 大于 RNN 大于 传统的n-gram n-gram VS Transformer 我们可以用一个 图书馆查询 的类比来解释它们的差异: 一、核心差异对比 维度n-gram 模型Transformer工作方式固定窗口的"近视观察员"全局关联的&q…...
DeepSeek部署教程(基于Ollama)
虽说在过年,但不能忘了学习。这几天科技圈最火的莫过于deepseek,我抽空也学习一下deepseek的部署过程,主要还是因为官方服务已经彻底瘫了[手动狗头]。 1、下载Ollama并安装 https://github.com/ollama/ollama/releases/latest/download/Oll…...
Java基础面试题总结(题目来源JavaGuide)
问题1:Java 中有哪 8 种基本数据类型?它们的默认值和占用的空间大小知道不? 说说这 8 种基本数据类型对 应的包装类型。 在 Java 中,有 8 种基本数据类型(Primitive Types): 基本数据类型关键…...
WPS mathtype间距太大、显示不全、公式一键改格式/大小
1、间距太大 用mathtype后行距变大的原因 mathtype行距变大到底怎么解决-MathType中文网 段落设置固定值 2、显示不全 设置格式: 打开MathType编辑器点击菜单栏中的"格式(Format)"选择"间距(Spacing)"在弹出的对话框中调整"分数间距(F…...
宇宙大爆炸是什么意思
根据宇宙大爆炸学说,宇宙间的一切都在彼此远离,而且距离越远,远离的速度越快。我们只能在地球上观察这种现象,而我们观察到的速度符合如下公式,其中 为哈勃常数, 为距离, 为速度(…...
MotionLCM 部署笔记
目录 依赖项 humanml3d: sentence-t5-large 下载数据: 报错:No module named sentence_transformers 继续报错:from transformers.integrations import CodeCarbonCallback 解决方法: GitHub - Dai-Wenxun/Moti…...
VLLM性能调优
1. 抢占 显存不够的时候,某些request会被抢占。其KV cache被清除,腾退给其他request,下次调度到它,重新计算KV cache。 报这条消息,说明已被抢占: WARNING 05-09 00:49:33 scheduler.py:1057 Sequence gr…...
ESP32-S3模组上跑通esp32-camera(39)
接前一篇文章:ESP32-S3模组上跑通esp32-camera(38) 一、OV5640初始化 2. 相机初始化及图像传感器配置 上一回继续对reset函数的后一段代码进行解析。为了便于理解和回顾,再次贴出reset函数源码,在components\esp32-camera\sensors\ov5640.c中,如下: static int reset…...
Linux《基础指令》
在之前的Linux《Linux简介与环境的搭建》当中我们已经初步了解了Linux的由来和如何搭建Linux环境,那么接下来在本篇当中我们就要来学习Linux的基础指令。在此我们的学习是包括两个部分,即指令和关于Linux的基础知识;因此本篇指令和基础知识的…...
9.进程间通信
9.进程间通信 **1. 进程间通信(IPC)概述****2. 无名管道(Pipe)****3. 有名管道(FIFO)****4. 信号通信(Signal)****5. 练习与作业****6. 信号的应用****7. 总结** 1. 进程间通信&…...
Windows中本地组策略编辑器gpedit.msc打不开/微软远程桌面无法复制粘贴
目录 背景 解决gpedit.msc打不开 解决复制粘贴 剪贴板的问题 启用远程桌面剪贴板与驱动器 重启RDP剪贴板监视程序 以上都不行?可能是操作被Win11系统阻止 最后 背景 远程桌面无法复制粘贴,需要查看下主机策略组设置,结果按WinR输入…...
供应链系统设计-供应链中台系统设计(十二)- 清结算中心设计篇(一)
概述 在之前的文章中,我们通过之前的两篇文章中,如下所示: 供应链系统设计-供应链中台系统设计(十)- 清结算中心概念片篇 供应链系统设计-供应链中台系统设计(十一)- 清结算中心概念片篇 说…...
Vue.js 单页应用(SPA)开发教程:从零开始构建你的第一个项目
单页应用(SPA,Single Page Application)是现代前端开发的主流模式。Vue.js 是一个非常适合构建 SPA 的框架,它通过 Vue Router 实现页面导航,通过组件化开发和状态管理实现复杂的交互功能。本篇教程将带你了解 SPA 的基…...
Linux C openssl aes-128-cbc demo
openssl 各版本下载 https://openssl-library.org/source/old/index.html#include <stdio.h> #include <string.h> #include <openssl/aes.h> #include <openssl/rand.h> #include <openssl/evp.h>#define AES_KEY_BITS 128 #define GCM_IV_SIZ…...
你了解哪些Java限流算法?
大家好,我是锋哥。今天分享关于【你了解哪些Java限流算法?】面试题。希望对大家有帮助; 你了解哪些Java限流算法? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Java 中常用的限流算法主要有以下几种,它们广泛应用于处理流量控…...
【漫话机器学习系列】065.梯度(Gradient)
梯度(Gradient) 在数学和机器学习中,梯度是一个向量,用来表示函数在某一点的变化方向和变化率。它是多变量函数的一阶偏导数的组合。 梯度的定义 设有一个标量函数 ,它对 是可微的,则该函数在某一点的…...
BswM(基础软件管理)详解
BswM(基础软件管理)详解 BswM(Basic Software Manager) 是 AUTOSAR BSW 的核心模块之一,负责协调基础软件(BSW)各模块的行为,根据系统状态、规则或事件动态配置其他模块。其设计目标…...
上位机知识篇---GitGitHub
文章目录 前言Git&GitHub是什么?GitGitHub Git和GitHub的区别定位功能使用方式开源协作 Git常用命令操作1. 配置2. 仓库操作3. 文件操作4. 分支与合并5.远程操作6.撤销更改7.查看历史 GitHub常用操作1.创建仓库2.Fork仓库3.Pull Request4.Issue跟踪5.代码审查 G…...
网站快速收录:提高页面加载速度的重要性
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/32.html 网站快速收录中,提高页面加载速度具有极其重要的意义。以下从多个方面详细阐述其重要性: 一、提升用户体验 减少用户等待时间:页面加载速度直接…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...
