【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/

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

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

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

相关文章

Redis - String相关命令

目录 setgetmsetmgetsetnx、setex、psetexincr、incrby、decr、decrby、incrbyfloatappendgetrangesetrangestrlen字符串类型编码方式总结 Redis - String Redis存储的字符串,是直接按二进制方式存储,不会做任何编码转换,存的是什么&#xff…

html基本结构和常见元素

html5文档基本结构 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>文档标题</title> </head> <body>文档正文部分 </body> </html> html文档可分为文档头和文档体…

LabVIEW的智能电源远程监控系统开发

在工业自动化与测试领域&#xff0c;电源设备的精准控制与远程管理是保障系统稳定运行的核心需求。传统电源管理依赖本地手动操作&#xff0c;存在响应滞后、参数调节效率低、无法实时监控等问题。通过集成工业物联网&#xff08;IIoT&#xff09;技术&#xff0c;实现电源设备…

33.Word:国家中长期人才发展规划纲要【33】

目录 NO1.2样式​ NO3​ 图表 ​ NO4.5.6​ 开始→段落标记视图→导航窗格→检查有无遗漏 NO1.2样式 F12/另存为&#xff1a;Word.docx&#xff1a;考生文件夹样式的复制样式的修改 样式的应用&#xff08;没有相似/超级多的情况下&#xff09;——替换 [ ]通配符&#x…

图漾相机——Sample_V1示例程序

文章目录 1.SDK支持的平台类型1.1 Windows 平台1.2 Linux平台 2.SDK基本知识2.1 SDK目录结构2.2 设备组件简介2.3 设备组件属性2.4 设备的帧数据管理机制2.5 SDK中的坐标系变换 3.Sample_V1示例程序3.1 DeviceStorage3.2 DumpCalibInfo3.3 NetStatistic3.4 SimpleView_SaveLoad…

Java集合框架

欢迎并且感谢大家指出我的问题&#xff0c;由于本人水平有限&#xff0c;有些内容写的不是很全面&#xff0c;只是把比较实用的东西给写下来&#xff0c;如果有写的不对的地方&#xff0c;还希望各路大牛多多指教&#xff01;谢谢大家&#xff01;&#x1f970; 一、引言 在 Ja…

DeepSeek最新图像模型Janus-Pro论文阅读

目录 论文总结 摘要 1. 引言 2. 方法 2.1 架构 2.2 优化的训练策略 2.4 模型扩展 3. 实验 3.1 实施细节 3.2 评估设置 3.3 与最新技术的比较 3.4 定性结果 4. 结论 论文总结 Janus-Pro是DeepSeek最新开源的图像理解生成模型&#xff0c;Janus-Pro在多模态理解和文…

Python爬虫:1药城店铺爬虫(完整代码)

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

【蓝桥杯】日志统计

日志统计&#xff08;编程题&#xff09;https://dashoj.com/d/lqbproblem/p/53https://dashoj.com/d/lqbproblem/p/53https://dashoj.com/d/lqbproblem/p/53 题目 日志统计(编程题) 讲解 这个讲解感觉比较通俗易懂。 蓝桥杯2018年省赛B组08&#xff08;c/c&#xff09;日…

一文讲解Spring中应用的设计模式

我们都知道Spring 框架中用了蛮多设计模式的&#xff1a; 工厂模式呢&#xff0c;就是用来创建对象的&#xff0c;把对象的创建和使用分开&#xff0c;这样代码更灵活。代理模式呢&#xff0c;是用一个代理对象来控制对真实对象的访问&#xff0c;可以在访问前后做一些处理。单…

AI 算力瓶颈,硬件、算法、共享能否破局?

随着AI技术的蓬勃发展&#xff0c;它已经实现了从实验室走向千行百业&#xff0c;然而在它想要继续深入地探索各行各业&#xff0c;解锁更多应用场景时&#xff0c;算力却成为了它面前的一道关卡。 这道关卡由无数需要处理的数据和计算任务堆积而成&#xff0c;想要实现AI技术…

华为小米vivo向上,苹果荣耀OPPO向下

日前&#xff0c;Counterpoint发布的手机销量月度报告显示&#xff0c;中国智能手机销量在2024年第四季度同比下降3.2%&#xff0c;成为2024年唯一出现同比下滑的季度。而对于各大智能手机品牌来说&#xff0c;他们的市场份额和格局也在悄然发生变化。 华为逆势向上 在2024年第…

github下载失败网页打开失败 若你已经知道github地址如何cmd下载

直接打开命令行&#xff1a; winr cmd 输入&#xff1a;git clone 地址 eg&#xff1a;git clone https://github.com/akospasztor/stm32f103-dfu-bootloader

K8S学习笔记-------1.安装部署K8S集群环境

1.修改为root权限 #sudo su 2.修改主机名 #hostnamectl set-hostname k8s-master01 3.查看网络地址 sudo nano /etc/netplan/01-netcfg.yaml4.使网络配置修改生效 sudo netplan apply5.修改UUID&#xff08;某些虚拟机系统&#xff0c;需要设置才能生成UUID&#xff09;#…

二维数组 C++ 蓝桥杯

1.稀疏矩阵 #include<iostream> using namespace std;const int N 1e4 10; int a[N][N];int main() {int n, m; cin >> n >> m;for (int i 1; i < n; i) {for (int j 1; j < m; j) {cin >> a[i][j];}}for (int j m; j > 1; j--) {for (i…

macos系统jmap执行异常

jdk8环境下执行jmap异常 网上说mac环境jdk8不支持Jmap&#xff0c;需要替换成更高的jdk版本&#xff0c;更改zshrc文件的jdk版本 环境变量生效 执行jmap不再报错

Linux 传输层协议 UDP 和 TCP

UDP 协议 UDP 协议端格式 16 位 UDP 长度, 表示整个数据报(UDP 首部UDP 数据)的最大长度如果校验和出错, 就会直接丢弃 UDP 的特点 UDP 传输的过程类似于寄信 . 无连接: 知道对端的 IP 和端口号就直接进行传输, 不需要建立连接不可靠: 没有确认机制, 没有重传机制; 如果因…

HTB:UnderPass[WriteUP]

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

ARM内核:嵌入式时代的核心引擎

引言 在当今智能设备无处不在的时代&#xff0c;ARM&#xff08;Advanced RISC Machines&#xff09;处理器凭借其高性能、低功耗的特性&#xff0c;成为智能手机、物联网设备、汽车电子等领域的核心引擎。作为精简指令集&#xff08;RISC&#xff09;的典范&#xff0c;ARM核…

基于RK3588/RK3576+MCU STM32+AI的储能电站电池簇管理系统设计与实现

伴随近年来新型储能技术的高质量规模化发展&#xff0c;储能电站作为新能源领域的重要载体&#xff0c; 旨在配合逐步迈进智能电网时代&#xff0c;满足电力系统能源结构与分布的创新升级&#xff0c;给予相应规模 电池管理系统的设计与实现以新的挑战。同时&#xff0c;电子系…