PyTorch 的张量(Tensor)与 NumPy 的数组(Array)区别

431 阅读4分钟

下面我会用通俗易懂的方式,向初学者解释 PyTorch 的张量(Tensor)NumPy 的数组(Array) 的区别,并通过代码示例帮助你理解。


🌟 一句话总结区别:

PyTorch 的张量和 NumPy 数组功能相似,但 PyTorch 张量支持 GPU 加速和自动求导(用于深度学习),而 NumPy 只能在 CPU 上运行,也不支持自动求导。


一、相似之处(先建立熟悉感)

PyTorch 的 Tensor 和 NumPy 的 ndarray 都是用来存储和操作多维数据的,比如:

  • 向量(1维)
  • 矩阵(2维)
  • 图像(3维或4维)
  • 批量数据(4维)

它们都支持:

  • 数学运算(加减乘除)
  • 广播机制
  • 索引和切片
  • 形状变换(reshape)

二、核心区别(重点来了!)

特性NumPy 数组 (ndarray)PyTorch 张量 (Tensor)
运行设备只能在 CPU 上运行可以在 CPU 或 GPU 上运行
自动求导❌ 不支持✅ 支持(requires_grad=True
深度学习支持❌ 不适合✅ PyTorch 的核心数据结构
GPU 加速❌ 不支持✅ 支持(通过 .to("cuda")
与神经网络集成❌ 不行✅ 可直接用于模型训练

三、代码示例对比

我们通过几个例子来直观感受它们的异同。

✅ 示例1:创建数组/张量

import numpy as np
import torch

# NumPy 创建数组
np_array = np.array([1, 2, 3])
print("NumPy array:", np_array)

# PyTorch 创建张量
pt_tensor = torch.tensor([1, 2, 3])
print("PyTorch tensor:", pt_tensor)

输出:

NumPy array: [1 2 3]
PyTorch tensor: tensor([1, 2, 3])

👉 看起来几乎一样!


✅ 示例2:数学运算(加法)

# NumPy
a_np = np.array([1, 2, 3])
b_np = np.array([4, 5, 6])
c_np = a_np + b_np
print("NumPy 加法:", c_np)

# PyTorch
a_pt = torch.tensor([1, 2, 3])
b_pt = torch.tensor([4, 5, 6])
c_pt = a_pt + b_pt
print("PyTorch 加法:", c_pt)

输出:

NumPy 加法: [5 7 9]
PyTorch 加法: tensor([5, 7, 9])

👉 运算方式完全一样!


✅ 示例3:自动求导(PyTorch 特有!)

这是 PyTorch 的核心优势——可以自动计算梯度,用于训练神经网络。

import torch

# 创建一个需要求导的张量
x = torch.tensor(2.0, requires_grad=True)

# 定义一个函数:y = x^2
y = x ** 2

# 自动求导(反向传播)
y.backward()

# 查看梯度 dy/dx = 2x = 4
print("梯度:", x.grad)  # 输出: tensor(4.)

👉 NumPy 做不到这一点!你得手动算导数。


✅ 示例4:GPU 加速(PyTorch 特有!)

# 检查是否有 GPU
device = "cuda" if torch.cuda.is_available() else "cpu"
print("使用设备:", device)

# 创建在 GPU 上的张量
gpu_tensor = torch.tensor([1, 2, 3]).to(device)
print("GPU tensor:", gpu_tensor)

# 大矩阵运算会明显更快(如果用 GPU)
large_tensor = torch.randn(10000, 10000).to(device)
result = torch.matmul(large_tensor, large_tensor)  # 矩阵乘法

👉 NumPy 只能在 CPU 上跑,没法利用 GPU 加速。


✅ 示例5:相互转换(很方便!)

PyTorch 和 NumPy 可以轻松互相转换:

# PyTorch Tensor → NumPy Array
pt = torch.tensor([1, 2, 3])
np_from_pt = pt.numpy()
print("转成 NumPy:", np_from_pt)

# NumPy Array → PyTorch Tensor
np_arr = np.array([4, 5, 6])
pt_from_np = torch.from_numpy(np_arr)
print("转成 Tensor:", pt_from_np)

⚠️ 注意事项

  1. GPU 上的 Tensor 不能直接转 NumPy
    ❌ 错误:gpu_tensor.numpy()
    ✅ 正确:gpu_tensor.cpu().numpy()

  2. requires_grad 只对浮点张量有效
    整数类型(如 int64)不能求导。

  3. PyTorch 默认类型更严格
    例如:torch.tensor([1,2,3])int64,而浮点运算常需 float32


四、总结(小白也能记住)

你想做什么?用哪个?
学习 Python 数据处理、统计、绘图✅ NumPy
图像处理、CSV 数据分析✅ NumPy + Pandas
做深度学习、训练神经网络、用 GPU✅ PyTorch Tensor
快速原型 + GPU 加速 + 自动求导✅ PyTorch
和 PyTorch 模型交互✅ 必须用 Tensor
从 NumPy 数据开始训练模型torch.from_numpy(...) 转成 Tensor
把训练结果画图分析.numpy() 转回 NumPy

🔔 小贴士:PyTorch 的设计非常像 NumPy,就是为了让你从 NumPy 过渡得更自然!


✅ 一句话送给你:

NumPy 是数据科学的基础工具,PyTorch 是深度学习的超级引擎 —— 它们的“数组”很像,但 PyTorch 更强大,尤其适合 AI 训练。


当然可以!下面是一份专为初学者设计的「PyTorch vs NumPy」对比速查表(Cheat Sheet),简洁明了,方便你快速查阅和记忆。


🧩 PyTorch Tensor vs NumPy Array 速查表

功能NumPy (ndarray)PyTorch (Tensor)说明
✅ 创建数组/张量np.array([1, 2, 3])torch.tensor([1, 2, 3])用法几乎一样
✅ 创建零矩阵np.zeros((2, 3))torch.zeros(2, 3)注意 PyTorch 不用双括号
✅ 创建随机数np.random.rand(2, 3)torch.rand(2, 3)生成 [0,1) 均匀分布
✅ 数学运算a + b, a * ba + b, a * b支持相同运算符
✅ 矩阵乘法np.dot(a, b)a @ btorch.matmul(a, b)a @ b推荐用 @
✅ 形状变换arr.reshape(3, 4)tensor.reshape(3, 4)用法一致
✅ 查看形状arr.shapetensor.shapetensor.size()一样
✅ 索引与切片arr[0], arr[:, 1]tensor[0], tensor[:, 1]完全兼容
🚫 自动求导❌ 不支持tensor.requires_grad = TruePyTorch 核心功能
🚫 GPU 加速❌ 仅 CPUtensor.to("cuda")PyTorch 可上 GPU
🔁 转换为对方torch.from_numpy(np_arr)tensor.numpy()注意:GPU tensor 需先 .cpu()
💡 数据类型指定np.array([1,2], dtype=np.float32)torch.tensor([1,2], dtype=torch.float32)类型名称略有不同
📦 常见类型简写np.float32, np.int64torch.float32, torch.int64torch.float, torch.longPyTorch 更灵活
🔄 共享内存(注意!)torch.from_numpy() 共享内存.numpy() 与原 tensor 共享内存修改一个会影响另一个