
概述
是什么
在深度学习和科学计算领域,NumPy 和 PyTorch 是两个非常重要的 Python 库。NumPy 是 Python 科学计算的基础包,专注于高效的数组操作。PyTorch 则是在 NumPy 基础上进一步发展,加入了自动求导和 GPU 支持
,使其成为神经网络构建的理想工具。
为什么
虽然 NumPy 强大,但它无法满足现代深度学习的关键需求:
缺乏自动求导机制
- NumPy 无法追踪计算图,不能进行反向传播。
- PyTorch 提供 autograd
- ,自动记录操作并计算梯度。
无法利用 GPU 加速
- NumPy 运算只能在 CPU 上执行,效率较低。
- PyTorch 可将张量转移到 GPU,大幅加速模型训练。
无法构建神经网络模型
- PyTorch 提供了丰富的神经网络模块
- 例如 torch.nn.Module,使构建、训练、优化神经网络变得简单高效。
NumPy 与 PyTorch 的对比
| 特性 | NumPy | PyTorch |
| 核心用途 | 通用科学计算,矩阵操作 | 深度学习框架,兼具张量计算与自动求导功能 |
| 核心对象 | ndarray | tensor |
| 自动求导 | ❌ 不支持 | ✅ 支持 autograd 自动反向传播 |
| GPU 支持 | ❌ 仅支持 CPU | ✅ 支持 GPU 加速 |
| 深度学习API | ❌ 无 | ✅ 有 (torch.nn, torch.optim, torchvision 等) |
怎么做
通过示例对比PyTorch 与 NumPy
| 功能 | NumPy | PyTorch |
| 数据类型 | ndarray,支持CPU计算 | Tensor,支持CPU和GPU计算,支持自动求导 |
| 构造器 | array, zeros, ones, arange, linspace等 | tensor, zeros, ones, arange, linspace等 |
| 形状变换 | reshape, transpose等 | reshape, transpose等 |
| 索引 | 切片、布尔索引、整数索引等 | 切片、布尔索引、整数索引等 |
| 数值计算 | dot, sum, mean等 | matmul, sum, mean等,支持自动求导 |
PyTorch和NumPy都提供了强大的工具和功能来操作数组和矩阵。为了帮助你更好地理解二者在常见操作上的异同,我们将根据以下几个方面进行对比:类型、构造器、形状变换、数据选择、数值计算等。这里的对比不仅帮助理解它们的API差异,也展示了PyTorch在深度学习中的优势。
1. 类型(Types)NumPy的核心类型是ndarray,它代表了一个多维数组,可以通过不同的数据类型(如int, float, complex等)来存储各种类型的数据。
PyTorch的核心类型是Tensor,它与NumPy的ndarray类似,但PyTorch的Tensor支持GPU加速,并且可以通过GPU(CUDA
)运算。PyTorch还支持自动求导,是深度学习计算的核心类型。
import numpy as npA = np.array([1, 2, 3], dtype=np.float32) # 指定数据类型print(A)import torchA = torch.tensor([1, 2, 3], dtype=torch.float32) # 指定数据类型print(A)2. 构造器(Constructor)
NumPy提供了多个构造函数来创建数组:
# 零和一 (zeros, ones): 创建全零或全一的数组。np.zeros((3, 3)) # 创建3x3的零矩阵 # 从已知数据构造 (array): 从Python列表、元组等创建NumPy数组。np.array([1, 2, 3]) # 数值范围 (arange, linspace): 创建指定范围的数组。np.arange(0, 10, 2) # 创建[0, 2, 4, 6, 8] np.linspace(0, 1, 5) # 创建[0.0, 0.25, 0.5, 0.75, 1.0]PyTorch也提供了类似的构造器来创建Tensor:
# 零和一 (zeros, ones): 创建全零或全一的张量。torch.zeros((3, 3)) # 创建3x3的零矩阵 # 从已知数据构造 (tensor): 从Python列表、NumPy数组等创建Tensor。torch.tensor([1, 2, 3]) # 数值范围 (arange, linspace): 创建指定范围的张量。torch.arange(0, 10, 2) # 创建[0, 2, 4, 6, 8] torch.linspace(0, 1, 5) # 创建[0.0, 0.25, 0.5, 0.75, 1.0]3. 形状(Shape)变换
NumPy提供了很多方法来改变数组的形状:
# reshape:改变数组的形状。A = np.array([1, 2, 3, 4, 5, 6]) A_reshaped = A.reshape((2, 3)) # transpose:转置数组。A_transposed = A.reshape((2, 3)).TPyTorch同样提供了形状变换方法:
# reshape:改变张量的形状。A = torch.tensor([1, 2, 3, 4, 5, 6]) A_reshaped = A.reshape((2, 3)) # transpose:转置张量。A_transposed = A.reshape((2, 3)).T4. 数据选择(Indexing)
NumPy支持基于整数、切片、布尔索引等多种方式进行数组元素选择。
A = np.array([1, 2, 3, 4, 5])A[1:3] # 切片A[A > 3] # 布尔索引PyTorch同样支持类似的索引方式。
A = torch.tensor([1, 2, 3, 4, 5])A[1:3] # 切片A[A > 3] # 布尔索引5. 数值计算(Numerical Computation)
NumPy包含了大量的数学函数,用于进行数值计算,如线性代数运算、数学函数等。
np.dot(A, B) # 矩阵乘法np.sum(A) # 求和np.mean(A) # 求均值PyTorch不仅提供了类似的数学函数,还具有自动求导功能,适用于深度学习中的梯度计算。
torch.matmul(A, B) # 矩阵乘法torch.sum(A) # 求和torch.mean(A) # 求均值
PyTorch在处理深度学习任务时,可以通过Autograd自动计算梯度。
A = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)B = torch.tensor([4.0, 5.0, 6.0], requires_grad=True)C = A + BC.backward() # 自动求导6. 向量和矩阵点积
- 向量点积和乘积
- 矩阵点积和乘积
1向量点积和乘积
代码实现
########################################################## Python手动实现、NumPy和PyTorch调库实现:向量点击和乘积########################################################import numpy as npimport torch# Python手动实现、NumPy和PyTorch调库实现# 点积(Dot Product)# 对于两个向量 a 和 b,它们的点积是两个向量对应位置元素的乘积之和# 对于两个向量 a 和 b,它们的内积是一个标量,即这两个向量的点积。def dot_product(a, b): return sum(i * j for i, j in zip(a, b))def dot_product_np(a, b): return np.dot(a, b)def dot_product_torch(a, b): return torch.dot(torch.tensor(a), torch.tensor(b))# 乘积(Element-wise Product)# 两个向量中对应位置的元素相乘,得到一个新的向量。def elementwise_product(a, b): return [i * j for i, j in zip(a, b)]def elementwise_product_np(a, b): return np.multiply(a, b)def elementwise_product_torch(a, b): return torch.mul(torch.tensor(a), torch.tensor(b))# 测试数据vec_a = [1, 2, 3]vec_b = [4, 5, 6]# 调用函数并打印结果print("Dot Product:")print(dot_product(vec_a, vec_b))print(dot_product_np(vec_a, vec_b))print(dot_product_torch(vec_a, vec_b).item())print("\nElement-wise Product:")print(elementwise_product(vec_a, vec_b))print(elementwise_product_np(vec_a, vec_b))print(elementwise_product_torch(vec_a, vec_b))2矩阵点积和乘积
代码实现
########################################################## Python手动实现、NumPy和PyTorch调库实现:矩阵点积和乘积########################################################import numpy as npimport torch# 矩阵的点积(Matrix Dot Product)# 两个矩阵 A 和 B 的点积是通过对 A 的行和 B 的列进行内积运算得到的新矩阵。def matrix_dot_product(A, B): result = [] for i in range(len(A)): row = [] for j in range(len(B[0])): sum = 0 for k in range(len(B)): sum += A[k] * B[k][j] row.append(sum) result.append(row) return resultdef matrix_dot_product_np(A, B): return np.dot(A, B)def matrix_dot_product_torch(A, B): return torch.matmul(torch.tensor(A), torch.tensor(B)).tolist()# 矩阵的乘积(Element-wise Matrix Product)# 两个矩阵中对应位置的元素相乘,得到一个新的矩阵。def elementwise_matrix_product(A, B): return [[A[j] * B[j] for j in range(len(A[0]))] for i in range(len(A))]def elementwise_matrix_product_np(A, B): return np.multiply(A, B)def elementwise_matrix_product_torch(A, B): return torch.mul(torch.tensor(A), torch.tensor(B)).tolist()# 测试数据matrix_A = [[1, 2], [3, 4]]matrix_B = [[5, 6], [7, 8]]# 调用函数并打印结果print("Matrix Dot Product:")print(matrix_dot_product(matrix_A, matrix_B))print(matrix_dot_product_np(matrix_A, matrix_B))print(matrix_dot_product_torch(matrix_A, matrix_B))print("\nElement-wise Matrix Product:")print(elementwise_matrix_product(matrix_A, matrix_B))print(elementwise_matrix_product_np(matrix_A, matrix_B))print(elementwise_matrix_product_torch(matrix_A, matrix_B))总结与参考
总结
- NumPy主要用于高效的数值计算,广泛应用于科学计算和数据处理。它适合于中小型数据集以及需要高效数组操作的任务。
- PyTorch除了拥有NumPy的基本功能外,还增加了自动求导和GPU加速,特别适用于深度学习领域。在需要大规模数据计算或
参考


雷达卡




京公网安备 11010802022788号







