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

news/2025/2/4 19:01:11 标签: numpy, python, 开发语言

在这里插入图片描述

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 TD
    A[NumPy数组内存布局]
    A --> B[行优先存储 (C语言)]
    A --> C[列优先存储 (Fortran)]
    B --> D[内存连续]
    C --> E[内存不连续]
1.22.2.2 转置操作的内存地址验证实验
1.22.2.2.1 代码示例
python">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 代码示例
python">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 plt

plt.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 代码示例
python">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 代码示例
python">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 代码示例
python">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 代码示例
python">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 代码示例
python">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.niftyadmin.cn/n/5841753.html

相关文章

关于贪心学习的文笔记录

贪心,顾名思义就是越贪越好,越多越有易,他给我的感觉是,通常是求最大或最小问题,相比于动态规划贪心让人更加琢磨不透,不易看出方法,为此在这记录我所见过的题型和思维方法,以便回头…

680.验证回文串||

解题思路 最多删除一个字符使其成为回文串,首先根据回文串的特点,即两边互相对应。 因此判断的方法可以有两种: 翻转后两个字符串相同,是回文串使用双指针进行判断 这里需要涉及删除,因此使用双指针,l和…

【C++】B2122 单词翻转

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 💯一、我的做法代码实现:代码解析思路分析 💯二、老师的第一种做法代码实现&a…

CNN的各种知识点(三):有关于VGG16 的结构展开的问题(1)

有关于VGG16 的结构展开的问题(1) 1. VGG16 的原生结构2. model.avgpool 的作用原生 VGG16 中没有 avgpool 层?代码中的 model.avgpool 是什么? 3. model.classifier 的作用原生 VGG16 的 classifier用户代码中的 classifier 4. 为…

Day33【AI思考】-分层递进式结构 对数学数系的 终极系统分类

文章目录 **分层递进式结构** 对数学数系的 **终极系统分类**总览**一、数系演化树(纵向维度)**数系扩展逻辑树**数系扩展逻辑** **二、代数结构对照表(横向维度)**数系扩展的数学意义 **三、几何对应图谱(空间维度&am…

2021版小程序开发5——小程序项目开发实践(1)

2021版小程序开发5——小程序项目开发实践(1) 学习笔记 2025 使用uni-app开发一个电商项目; Hbuidler 首选uni-app官方推荐工具:https://www.dcloud.io/hbuilderx.htmlhttps://dev.dcloud.net.cn/pages/app/list 微信小程序 管理后台:htt…

LeetCode--347. 前 K 个高频元素/Golang中的堆(container/heap)

例题链接-前k个高频元素 前言 以前都是用的C写算法题,最近也想熟悉一下golang的数据结构,故来一篇题解堆分析。 正文 这里重点不在分析题目,在于golang中的 container/heap 对于内部实现逻辑有兴趣的可以去看看源码。 这里先给出题解的代…

Vue和Java使用AES加密传输

背景:Vue对参数进行加密,对响应进行解密。Java对参数进行解密,对响应进行解密。不拦截文件上传类请求、GET请求。 【1】前端配置 安装crypto npm install crypto-js编写加解密工具类encrypt.js import CryptoJS from crypto-jsconst KEY …