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

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

在这里插入图片描述

1.22 形状操控者:转置与轴交换的奥秘

目录

形状操控者:转置与轴交换的奥秘
引言
内存布局对转置性能的影响
爱因斯坦求和约定实践
高维张量轴交换可视化
矩阵运算的几何解释
总结
参考文献
  1. 引言
  2. 内存布局对转置性能的影响
  3. 爱因斯坦求和约定实践
  4. 高维张量轴交换可视化
  5. 矩阵运算的几何解释
  6. 总结
  7. 参考文献
转置操作
内存布局
轴交换
应用场景
C顺序 vs F顺序
高维张量
矩阵运算
密码学
性能优化
爱因斯坦求和
几何变换
置换密码

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=1Nmi(δjkri2rijrik)

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张量轴交换示意图
原始轴序: 0,1,2,3
交换后轴序: 2,3,0,1
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限流算法?

大家好&#xff0c;我是锋哥。今天分享关于【你了解哪些Java限流算法?】面试题。希望对大家有帮助&#xff1b; 你了解哪些Java限流算法? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Java 中常用的限流算法主要有以下几种&#xff0c;它们广泛应用于处理流量控…...

【漫话机器学习系列】065.梯度(Gradient)

梯度&#xff08;Gradient&#xff09; 在数学和机器学习中&#xff0c;梯度是一个向量&#xff0c;用来表示函数在某一点的变化方向和变化率。它是多变量函数的一阶偏导数的组合。 梯度的定义 设有一个标量函数 &#xff0c;它对 ​ 是可微的&#xff0c;则该函数在某一点的…...

BswM(基础软件管理)详解

BswM&#xff08;基础软件管理&#xff09;详解 BswM&#xff08;Basic Software Manager&#xff09; 是 AUTOSAR BSW 的核心模块之一&#xff0c;负责协调基础软件&#xff08;BSW&#xff09;各模块的行为&#xff0c;根据系统状态、规则或事件动态配置其他模块。其设计目标…...

上位机知识篇---GitGitHub

文章目录 前言Git&GitHub是什么&#xff1f;GitGitHub Git和GitHub的区别定位功能使用方式开源协作 Git常用命令操作1. 配置2. 仓库操作3. 文件操作4. 分支与合并5.远程操作6.撤销更改7.查看历史 GitHub常用操作1.创建仓库2.Fork仓库3.Pull Request4.Issue跟踪5.代码审查 G…...

网站快速收录:提高页面加载速度的重要性

本文转自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/32.html 网站快速收录中&#xff0c;提高页面加载速度具有极其重要的意义。以下从多个方面详细阐述其重要性&#xff1a; 一、提升用户体验 减少用户等待时间&#xff1a;页面加载速度直接…...

Vue.js组件开发-实现全屏背景图片滑动切换特效

使用 Vue 实现全屏背景图片滑动切换特效的详细步骤、代码、注释和使用说明。 步骤 创建 Vue 项目&#xff1a;使用 Vue CLI 创建一个新的 Vue 项目。准备图片资源&#xff1a;准备好要用于背景切换的图片&#xff0c;并将它们放在项目的合适目录下。编写 HTML 结构&#xff1…...

DeepSeek r1本地安装全指南

环境基本要求 硬件配置 需要本地跑模型&#xff0c;兼顾质量、性能、速度以及满足日常开发需要&#xff0c;我们需要准备以下硬件&#xff1a; CPU&#xff1a;I9内存&#xff1a;128GB硬盘&#xff1a;3-4TB 最新SSD&#xff0c;C盘确保有400GB&#xff0c;其它都可划成D盘…...

LitGPT - 20多个高性能LLM,具有预训练、微调和大规模部署的recipes

文章目录 一、关于 LitGPT二、快速启动安装LitGPT高级安装选项 从20多个LLM中进行选择 三、工作流程1、所有工作流程2、微调LLM3、部署LLM4、评估LLM5、测试LLM6、预训练LLM7、继续预训练LLM 四、最先进的功能五、训练方法示例 六、项目亮点教程 一、关于 LitGPT LitGPT 用于 …...

deepseek R1 14b显存占用

RTX2080ti 11G显卡&#xff0c;模型7b速度挺快&#xff0c;试试14B也不错。 7B显存使用5.6G&#xff0c;14B显存刚好够&#xff0c;出文字速度差不多。 打算自己写个移动宽带的IPTV播放器&#xff0c;不知道怎么下手&#xff0c;就先问他了。...

无用知识研究:对std::common_type以及问号表达式类型的理解

先说结论&#xff1a; 如果问号表达式能编译通过&#xff0c;那么std::common_type就能通过。因为common_type的底层依赖的就是?: common_type的实现里&#xff0c;利用了问号表达式&#xff1a;ternary conditional operator (?:) https://stackoverflow.com/questions/14…...

MapReduce概述

目录 1. MapReduce概述2. MapReduce的功能2.1 数据划分和计算任务调度2.2 数据/代码互定位2.3 系统优化2.4 出错检测和恢复 3. MapReduce处理流程4. MapReduce编程基础参考 1. MapReduce概述 MapReduce是面向大数据并行处理的计算模型、框架和平台:   1. 基于集群的高性能并行…...

循环神经网络(RNN)+pytorch实现情感分析

目录 一、背景引入 二、网络介绍 2.1 输入层 2.2 循环层 2.3 输出层 2.4 举例 2.5 深层网络 三、网络的训练 3.1 训练过程举例 1&#xff09;输出层 2&#xff09;循环层 3.2 BPTT 算法 1&#xff09;输出层 2&#xff09;循环层 3&#xff09;算法流程 四、循…...

Mac cursor设置jdk、Maven版本

基本配置 – Cursor 使用文档 首先是系统用户级别的设置参数&#xff0c;运行cursor&#xff0c;按下ctrlshiftp&#xff0c;输入Open User Settings(JSON)&#xff0c;在弹出的下拉菜单中选中下面这样的&#xff1a; 在打开的json编辑器中追加下面的内容&#xff1a; {"…...

WPS数据分析000005

目录 一、数据录入技巧 二、一维表 三、填充柄 向下自动填充 自动填充选项 日期填充 星期自定义 自定义序列 1-10000序列 四、智能填充 五、数据有效性 出错警告 输入信息 下拉列表 六、记录单 七、导入数据 ​编辑 八、查找录入 会员功能 Xlookup函数 VL…...

CTF从入门到精通

文章目录 背景知识CTF赛制 背景知识 CTF赛制 1.web安全:通过浏览器访问题目服务器上的网站&#xff0c;寻找网站漏洞(sql注入&#xff0c;xss&#xff08;钓鱼链接&#xff09;,文件上传&#xff0c;包含漏洞&#xff0c;xxe&#xff0c;ssrf&#xff0c;命令执行&#xff0c…...