Pytorch深度学习教程_2_Numpy数值计算
欢迎来到PyTorch深度学习教程系列!在本系列中,我们将从零开始学习如何使用PyTorch进行深度学习开发。本篇是系列的第二篇,我们将快速掌握Numpy数值计算,为后续的深度学习学习打下坚实的基础。
对于深度学习环境配置及pytorch的下载安装可以用我写的博客:
2025最新深度学习pytorch完整配置:conda/jupyter/vscode-CSDN博客
之前的一篇博客系统梳理了python的框架,可以先看这个:
Pytorch深度学习教程_1_Python基础快速掌握-CSDN博客
目录
1.NumPy基础
什么是 NumPy 数组?
创建 NumPy 数组
从 Python 列表创建:
使用内置函数创建:
NumPy 数组的关键属性
基本操作
算术运算:
索引和切片:访问数组中的特定元素或子集。
2.数组操作和广播机制
基本数组操作
广播机制
常见问题和最佳实践
3.Numpy线性代数计算
数据形式
向量:用一维NumPy数组表示。
矩阵:用二维NumPy数组表示。
基本线性代数运算
矩阵乘法:
矩阵求逆:
行列式:
特征值和特征向量:
线性代数是许多领域的基础:
4.Numpy数据操作
重塑数组
合并数组
分割数组
索引和切片的深入
挑战和注意事项
5.结语
1.NumPy基础
NumPy 是 Python 中数值计算的基石库。它提供了高性能的多维数组对象,以及大量用于操作这些数组的函数集合。
什么是 NumPy 数组?
与 Python 列表不同,NumPy 数组是同构的,意味着它们包含相同数据类型的元素。这种统一性使得计算和内存使用效率更高。此外,NumPy 数组支持多维结构,非常适合表示矩阵和张量。
创建 NumPy 数组
你可以从多种来源创建 NumPy 数组:
从 Python 列表创建:
import numpy as np
my_list = [1, 2, 3, 4]
my_array = np.array(my_list)
使用内置函数创建:
zeros = np.zeros(5) # 创建一个全零数组
ones = np.ones((2, 3)) # 创建一个 2x3 的全一数组
arange = np.arange(10) # 创建一个从 0 到 9 的数组
NumPy 数组的关键属性
-
形状 (Shape):定义数组的维度。
print(my_array.shape) # 输出数组的形状
- 数据类型 (Data type):指定数组中元素的类型。
print(my_array.dtype) # 输出数组的数据类型
- 大小 (Size):数组中元素的总数。
print(my_array.size) # 输出数组的元素个数
基本操作
NumPy 擅长在数组上进行元素级操作,相比 Python 列表具有显著的速度优势。
算术运算:
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])
result = x + y # 元素级加法
索引和切片:访问数组中的特定元素或子集。
first_element = my_array[0] # 获取第一个元素
subarray = my_array[1:3] # 获取从索引 1 到 2 的子数组
2.数组操作和广播机制
NumPy 允许对整个数组进行操作,而不需要显式的循环,这得益于向量化和广播机制。
基本数组操作
算术运算在兼容的数组上按元素进行:
import numpy as np
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])
sum_array = x + y # 元素级加法
difference = x - y # 元素级减法
product = x * y # 元素级乘法
division = x / y # 元素级除法
聚合函数用于计算数组的统计信息:
mean_value = np.mean(x)
sum_value = np.sum(x)
max_value = np.max(x)
min_value = np.min(x)
广播机制
广播是 NumPy 的一项功能,允许在不同形状的数组之间进行操作,通过扩展较小的数组以匹配较大数组的形状。
scalar = 2
array = np.array([1, 2, 3])
result = array * scalar # 将标量扩展为数组形状
更复杂的广播机制:
a = np.array([[1, 2], [3, 4]])
b = np.array([10, 20])
result = a * b # 将 b 扩展以匹配 a 的形状
常见问题和最佳实践
- 形状不匹配:确保数组在操作时形状兼容。
- 索引错误:注意索引范围,避免越界错误。
- 性能优化:尽量使用向量化操作以提高效率。
- 代码清晰:使用清晰的变量名和注释。
通过掌握数组操作和广播机制,可以充分发挥 NumPy 在数值计算方面的潜力。
3.Numpy线性代数计算
线性代数涉及向量空间、线性变换和线性方程组。它是从图像处理到机器学习等各种应用背后的数学语言。NumPy提供了一套丰富的函数来进行线性代数运算,使其成为数据科学家和工程师的强大工具。
数据形式
向量:用一维NumPy数组表示。
import numpy as np
vector = np.array([1, 2, 3])
矩阵:用二维NumPy数组表示。
matrix = np.array([[1, 2], [3, 4]])
基本线性代数运算
矩阵乘法:
result = np.dot(matrix1, matrix2)
矩阵求逆:
inverse = np.linalg.inv(matrix)
行列式:
determinant = np.linalg.det(matrix)
特征值和特征向量:
eigenvalues, eigenvectors = np.linalg.eig(matrix)
线性代数是许多领域的基础:
- 机器学习:用于回归、分类和神经网络。
- 图像处理:将图像表示为矩阵并进行变换。
- 计算机图形学:使用矩阵操作3D对象。
- 物理和工程:用线性方程建模物理系统。
4.Numpy数据操作
NumPy 是一个强大的工具,用于处理和重塑数组,以满足数据处理需求。这些操作对于准备机器学习数据和执行各种计算至关重要。
重塑数组
重塑数组是指在不改变数据的情况下改变数组的形状。
import numpy as np
array = np.arange(12)
reshaped_array = array.reshape(3, 4)
展平数组是指将多维数组转换为一维数组。
flattened_array = reshaped_array.flatten()
合并数组
连接数组是指沿着现有轴连接数组。
array1 = np.array([1, 2, 3])
array2 = np.array([4, 5, 6])
combined_array = np.concatenate((array1, array2))
堆叠数组是指沿着新轴堆叠多个数组,创建一个新的数组。
stacked_array = np.stack((array1, array2))
分割数组
分割数组是指将数组分成多个子数组。
split_array = np.split(array, 3)
索引和切片的深入
我们已经了解了基本的索引和切片操作,现在让我们更深入地探讨。
花式索引是指使用索引数组来选择元素。
indices = [1, 3]
selected_elements = array[indices]
布尔索引是指根据布尔条件选择元素。
condition = array > 5
filtered_array = array[condition]
挑战和注意事项
- 形状兼容性:确保数组在操作(如连接和堆叠)时具有兼容的形状。
- 效率:对于大型数据集,考虑使用优化的函数,如
np.concatenate
,而不是循环。 - 内存使用:在重塑或创建大型数组时,注意内存消耗。
通过掌握数组操作技术,你将能够高效地处理各种数据处理任务。
5.结语
如此一来,你已经快速掌握了numpy的基本使用,接下来在实践的过程中,遇到更多的numpy问题,可以边用边查,这个是最好的。
下一章我们正式开始pytorch的学习!