目录
NumPy模块介绍
NumPy 是 Python 科学计算领域的重要基石,与当前 “躺吃旅行” 话题看似不相关,但在数据处理分析上意义重大。我将从它的核心功能、应用场景和优势等方面展开介绍。
NumPy(Numerical Python)是 Python 语言中用于科学计算的基础库,它提供了高性能的多维数组对象以及大量用于对数组进行操作的函数,是数据科学、机器学习、人工智能等领域不可或缺的工具。NumPy 的核心数据结构是ndarray(多维数组),这种数组允许在内存中以连续的方式存储同类型的数据,相较于 Python 原生列表,它在存储和运算效率上有着显著提升。通过 NumPy,用户可以轻松实现数组的创建、索引、切片、变形,以及各种数学运算,如矩阵乘法、统计计算、傅里叶变换等。
在实际应用中,NumPy 广泛应用于数据分析、机器学习算法的底层实现、图像和信号处理等领域。例如,在机器学习中,数据集通常会被加载并转换为 NumPy 数组进行预处理和模型训练;在图像处理中,图像数据也会被表示为多维数组,借助 NumPy 提供的函数完成图像的滤波、变换等操作。此外,NumPy 还与众多科学计算库紧密集成,如 SciPy、Pandas 等,共同构建起强大的 Python 科学计算生态,极大地提升了数据处理和分析的效率。
本期课程,我将从概念、逻辑、实操、应用4各层面阐释我对这个模块的理解,希望为喜欢Python的学习者提供一个内容详实、逻辑清晰、容易上手的课程。
3.4 NumPy 数组重塑与转置
3.4.1 操作机制的理论逻辑
(一)内存布局与视图机制
NumPy 数组在内存中以连续的块存储元素,无论数组的维度如何,其元素在内存中都是线性排列的。例如,二维数组[[1,2],[3,4]]在内存中实际存储为[1,2,3,4]。
重塑和转置操作并不会改变数组在内存中的实际存储顺序,而是通过修改数组的元数据(如形状、步长等)来创建一个新的 "视图"。视图与原数组共享底层数据,因此这些操作非常高效,不会占用额外的内存空间。
(二)形状与步长的关系
数组的形状(shape)定义了每个维度的大小,而步长(strides)则定义了在内存中访问下一个元素时需要跳过的字节数。例如,对于一个形状为(2,3)的二维数组,其步长可能为(24,8),表示在第一个维度上移动一步需要跳过 24 个字节(即 3 个元素),在第二个维度上移动一步需要跳过 8 个字节(即 1 个元素)。
重塑和转置操作通过调整形状和步长来改变数组的访问方式,而不改变底层数据的存储顺序。
3.4.2 一维数组的重塑
(一)基本概念
一维数组的重塑是指将一个一维数组转换为多维数组的过程。在重塑过程中,需要保证新数组的元素总数与原数组相同。
(二)案例及代码演示
import numpy as np
# 创建一个一维数组
arr = np.arange(12)
print("原一维数组:")
print(arr)
# 将一维数组重塑为3行4列的二维数组
reshaped_arr1 = arr.reshape(3, 4)
print("\n重塑为3行4列的二维数组:")
print(reshaped_arr1)
# 使用-1自动计算维度
reshaped_arr2 = arr.reshape(2, -1) # -1表示该维度的大小由系统自动计算
print("\n重塑为2行的二维数组(自动计算列数):")
print(reshaped_arr2)
3.4.3 多维数组的重塑
(一)基本概念
多维数组的重塑是指将一个多维数组转换为另一种维度结构的数组的过程。同样,在重塑过程中,需要保证新数组的元素总数与原数组相同。
(二)案例及代码演示
import numpy as np
# 创建一个3行4列的二维数组
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print("原二维数组:")
print(arr)
# 将二维数组重塑为4行3列的二维数组
reshaped_arr1 = arr.reshape(4, 3)
print("\n重塑为4行3列的二维数组:")
print(reshaped_arr1)
# 将二维数组重塑为3维数组
reshaped_arr2 = arr.reshape(2, 2, 3)
print("\n重塑为2页2行3列的三维数组:")
print(reshaped_arr2)
3.4.4 数组的转置操作
(一)T 属性的用法
T 属性是 NumPy 数组的一个属性,用于返回数组的转置视图。对于二维数组,转置就是将行和列互换。
import numpy as np
# 创建一个2行3列的二维数组
arr = np.array([[1, 2, 3], [4, 5, 6]])
print("原二维数组:")
print(arr)
# 使用T属性进行转置
transposed_arr = arr.T
print("\n转置后的二维数组:")
print(transposed_arr)
(二)transpose () 函数的应用
transpose () 函数可以用于更复杂的轴交换操作,特别是对于多维数组。它接受一个轴编号的元组作为参数,表示新的轴顺序。
import numpy as np
# 创建一个三维数组
arr = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print("原三维数组:")
print(arr)
# 使用transpose()函数进行轴交换
transposed_arr = arr.transpose(1, 0, 2) # 将原轴0和轴1交换
print("\n轴交换后的三维数组:")
print(transposed_arr)
3.4.5 知识点总结与课程回顾
(一)重点内容
1. 重塑和转置操作都是通过创建视图来实现的,不会改变底层数据的存储顺序。
2. 一维数组可以通过 reshape () 方法转换为多维数组,多维数组也可以通过 reshape () 方法转换为其他维度的数组。
3. 数组的转置可以通过 T 属性或 transpose () 函数实现,T 属性适用于简单的行列互换,transpose () 函数适用于更复杂的轴交换操作。
(二)难点内容
1. 理解重塑和转置操作背后的内存布局和视图机制。
2. 对于多维数组,正确使用 transpose () 函数进行轴交换可能需要一定的空间想象力。
(三)趣味案例
1. 图像处理中的图像旋转:在图像处理中,经常需要对图像进行旋转操作。可以使用 NumPy 的数组转置功能来实现图像的旋转。例如,将一张风景照片顺时针旋转 90 度。
2. 数据分析中的数据重构:在数据分析中,有时需要将数据从一种格式转换为另一种格式。例如,将一个包含多个学生成绩的二维数组重构为一个包含每个学生各科成绩的三维数组,以便更好地进行分析。
3. 游戏开发中的矩阵变换:在游戏开发中,经常需要对游戏对象进行变换操作,如旋转、缩放等。这些变换可以通过矩阵运算来实现,而 NumPy 的数组操作可以方便地实现这些矩阵运算。
3.4.6 课后练习题
(一)练习题 1
创建一个一维数组arr = np.arange(24),将其重塑为一个 4 行 6 列的二维数组,然后将这个二维数组转置,最后输出转置后的数组。
(二)练习题 2
创建一个三维数组arr = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]),使用 transpose () 函数将其轴顺序调整为 (2, 0, 1),然后输出调整后的数组。
(三)练习题 3
创建一个 5 行 5 列的二维数组,数组元素为 1 到 25 的整数。将这个二维数组进行重塑,使其成为一个一维数组,然后再将这个一维数组重塑为一个 5 行 5 列的二维数组,但行列顺序与原数组相反。输出最终的二维数组。
听我课的同学们不要手懒,我每节课都会准备一些趣味案例和课后练习题,大家看完这些内容,可以上手操作一下。可以将自己实操的结果放到评论中,不懂的地方也可以跟我交流,欢迎交流,老师有问必答。