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

【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 TD
    A[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 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 代码示例
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.kler.cn/a/526451.html

相关文章:

  • AI大模型开发原理篇-4:神经概率语言模型NPLM
  • AI时序预测: iTransformer算法代码深度解析
  • NLP深度学习 DAY5:Seq2Seq 模型详解
  • Kafka 消费端反复 Rebalance: `Attempt to heartbeat failed since group is rebalancing`
  • 论文阅读(九):通过概率图模型建立连锁不平衡模型和进行关联研究:最新进展访问之旅
  • GSI快速收录服务:让你的网站内容“上架”谷歌
  • (●ˇ∀ˇ●)思维导图计划~~~
  • 进阶数据结构——高精度运算
  • 探索性测试与自动化测试的结合
  • android 音视频系列引导
  • Python3 【集合】项目实战:3 个新颖的学习案例
  • 【笑着写算法系列】二分查找
  • 在 WSL2 中重启 Ubuntu 实例
  • 特殊Token区域与共享区域
  • 分享|借鉴传统操作系统中分层内存系统的理念(虚拟上下文管理技术)提升LLMs在长上下文中的表现
  • LINUX部署微服务项目步骤
  • C++:多继承习题5
  • 文件(c语言文件流)
  • AI时序预测: iTransformer算法代码深度解析
  • UE学习日志#15 C++笔记#1 基础复习
  • 无线通信与人工智能技术与发展年度总结
  • MYSQL 商城系统设计 商品数据表的设计 商品 商品类别 商品选项卡 多表查询
  • Kafka 压缩算法详细介绍
  • 【股票数据API接口41】如何获取股票指最新分时MA数据之Python、Java等多种主流语言实例代码演示通过股票数据接口获取数据
  • gesp(C++六级)(7)洛谷:P10376:[GESP202403 六级] 游戏
  • 范冰冰担任第75届柏林电影节主竞赛单元评委 共鉴电影佳作