可以将 PyTorch Tensor 看作是 NumPy ndarray 的一个 “超集”,类似于 Javascript与 Typescript的关系,它为深度学习的需求进行了专门的优化和功能增强

核心区别一览表

特性PyTorch TensorNumPy ndarray
主要用途专为深度学习和神经网络设计通用的科学计算和数据分析
硬件加速原生支持 GPU 和其他加速器 (TPU)仅限 CPU
自动求导核心功能,内置 autograd 引擎不支持,需要手动计算导数
生态系统与 torch.nn, torch.optim 等深度学习模块无缝集成与 SciPy, Pandas, Scikit-learn 等科学计算库紧密集成
操作拥有大量深度学习相关的操作(如卷积、池化等)拥有广泛的通用数学和线性代数操作

三大关键区别详解

1. 支持GPU硬件加速

两者最显著的区别

深度学习涉及海量的矩阵和张量运算,这些运算在 GPU 上的执行效率远超 CPU

PyTorch Tensor

被设计为可以轻松地在 CPU 和 GPU 之间移动

只需要一个简单的命令 (.to('cuda')) 就可以将张量及其所有后续计算转移到 GPU 上执行,从而获得数十倍甚至上百倍的性能提升

import torch
# 创建一个在 CPU 上的张量
x_cpu = torch.randn(3, 3)
print("x is on device:", x_cpu.device)

# 检查是否有可用的 GPU
if torch.cuda.is_available():
    # 将张量移动到 GPU
    x_gpu = x_cpu.to('cuda')
    print("x is now on device:", x_gpu.device)
    # 在 GPU 上执行的运算会非常快
    y = x_gpu @ x_gpu

NumPy ndarray

完全基于 CPU 进行计算。它无法直接利用 GPU 的计算能力。

如果尝试用 NumPy 处理大型神经网络的训练,计算时间将会长得无法接受

2. 自动求导 Autograd

这是 Tensor 成为深度学习基石的核心原因

神经网络的训练依赖于反向传播 Backpropagation 算法,该算法的本质就是计算损失函数对模型中每一个参数的梯度 gradient

PyTorch Tensor

  • 内置了一个名为 autograd 的自动求导引擎。创建一个张量时,可以设置 requires_grad=True 来告诉 PyTorch:“ 请追踪这个张量的所有计算历史”
  • 完成前向计算后,只需在最终结果(通常是损失值)上调用 .backward() 方法,PyTorch 就会自动计算出所有 requires_grad=True 的张量相对于该结果的梯度,并保存在它们的 .grad 属性中
import torch
# 创建一个张量并要求追踪其梯度
x = torch.tensor(2.0, requires_grad=True)
# 定义一个简单的函数 y = x^2 + 3x
y = x**2 + 3*x
# 自动计算梯度
y.backward()
# 查看 x 的梯度 (dy/dx = 2x + 3 = 2*2 + 3 = 7)
print("Gradient of x is:", x.grad) # 输出: tensor(7.)

NumPy ndarray

完全没有这个功能。如果使用 NumPy,你需要手动推导所有梯度计算的数学公式,然后用代码实现它们。

对于一个简单的函数尚可,但对于一个拥有数百万参数的深度神经网络,这几乎是不可能完成的任务

3. 生态系统整合

PyTorch Tensor:

是 PyTorch 生态系统的根

它被设计用来与 torch.nn (神经网络层)、torch.optim (优化器)、DataLoader (数据加载器) 等模块无缝协作。整个框架都围绕着 Tensor 进行构建。

NumPy ndarray:

是 Python 科学计算生态系统的基石

它与 SciPy (科学计算)、Pandas (数据分析)、Scikit-learn (传统机器学习)、Matplotlib (可视化) 等库紧密集成。需要进行数据预处理、分析或使用非深度学习的机器学习模型时,NumPy 是首选


相似之处与互操作性

PyTorch Tensor 在 API 设计上刻意地模仿了 NumPy

相似的 API:

​ 它们拥有大量同名且功能相似的操作,例如索引、切片、形状变换 (.reshape)、数学运算 (.sum, .mean, .dot 等)。这使得熟悉 NumPy 的用户可以非常平滑地过渡到 PyTorch

高效的相互转换:

  • 可以通过 .numpy() 方法将一个在 CPU 上的 Tensor 零拷贝地转换为 NumPy ndarray
  • 可以通过 torch.from_numpy() 方法将一个 NumPy ndarray 零拷贝地转换为 CPU Tensor
  • 零拷贝 意味着它们共享同一块内存,修改其中一个会立即影响另一个,这使得两者在数据预处理阶段的协作非常高效
Author

JuyaoHuang

Publish Date

10 - 26 - 2025