NumPy:深度学习初学者的必备工具——为什么先学它比先学 PyTorch 更重要

为什么深度学习初学者应该先学 NumPy?



在大多数深度学习书籍或课程中,PyTorch、TensorFlow 等框架往往是第一位出现的。然而,当你真正开始搭建模型时,往往会遇到以下困惑。

  • “张量(tensor)到底是什么?”
  • “形状不匹配,为什么会报错?”
  • “我以为这样拼接批次就行了…?”

这些大部分混乱实际上是因为 在没有充分理解 NumPy 的情况下直接跳到深度学习框架 所导致的。

  • PyTorch 的 TensorNumPy 的 ndarray 概念几乎相同
  • 数据预处理、批次生成、统计计算等仍然需要 NumPy 风格的思考

因此,如果你想真正掌握深度学习,NumPy 可以说是几乎不可或缺的基础体能


NumPy 是什么?

NumPy(Numerical Python) 是一个帮助 Python 进行快速数值计算的库。

核心关键词总结:

  • 多维数组(ndarray):向量、矩阵、张量表达的基础
  • 向量化运算:无需 for 循环即可一次性处理大量运算
  • 广播(Broadcasting):即使形状不同的数组也能智能运算
  • 线性代数运算:矩阵乘、转置、逆矩阵等
  • 随机模块:数据采样、正态分布、随机初始化等

几乎所有深度学习中使用的公式都归结为 “向量与矩阵运算”,因此让你轻松处理这些运算的 NumPy 可以说是深度学习的语言。


Python 列表 vs NumPy 数组



先简单比较一下 Python 基础列表和 NumPy 数组的区别。

# Python 基础列表
a = [1, 2, 3, 4]
b = [10, 20, 30, 40]

# 列表相加
print(a + b)
# 结果: [1, 2, 3, 4, 10, 20, 30, 40]  (拼接)

列表的 +拼接 而不是 “逐元素相加”。

import numpy as np

a = np.array([1, 2, 3, 4])
b = np.array([10, 20, 30, 40])

print(a + b)
# 结果: [11 22 33 44]  (逐元素相加)

NumPy 数组的 + 是我们在数学中期望的 逐元素(element-wise)运算。深度学习框架的 Tensor沿用 NumPy 的风格


向量化:减少循环,像数学公式一样编码

在深度学习代码中,常常被告知要 最小化 for 循环。相反,使用 向量化(vectorization)

举例:对所有元素求平方。

Python 列表 + for 循环

data = [1, 2, 3, 4, 5]
squared = []
for x in data:
    squared.append(x ** 2)

print(squared)  # [1, 4, 9, 16, 25]

NumPy 向量化

import numpy as np

data = np.array([1, 2, 3, 4, 5])
squared = data ** 2

print(squared)  # [ 1  4  9 16 25]
  • 代码更短
  • 接近数学公式
  • 内部使用 C 实现,性能更好

PyTorch、TensorFlow 的张量运算也同样使用 向量化的 NumPy 风格


广播:形状不同也能一起运算

广播(broadcasting)是 不同尺寸数组自动匹配形状的规则

举例:给每个样本加上相同的常数值。

import numpy as np

x = np.array([[1, 2, 3],
              [4, 5, 6]])   # shape: (2, 3)

b = np.array([10, 20, 30])  # shape: (3,)

y = x + b
print(y)
# [[11 22 33]
#  [14 25 36]]

x 是 (2, 3),b 是 (3,),NumPy 会把 b 视为 (1, 3)(2, 3) 进行运算。

PyTorch 也同样适用:

import torch

x = torch.tensor([[1, 2, 3],
                  [4, 5, 6]])
b = torch.tensor([10, 20, 30])

y = x + b
print(y)

因此,掌握 NumPy 的广播规则,在 PyTorch 张量运算时会更自然。


向量、矩阵、张量:用 NumPy 表达深度学习

在深度学习中常见的概念用 NumPy 表示:

  • 向量(vector):1 维数组 → shape: (N,)
  • 矩阵(matrix):2 维数组 → shape: (M, N)
  • 张量(tensor):3 维及以上数组

  • 例:图像批次

    • batch_size = 32,灰度 28x28 图像 → shape: (32, 28, 28)

举例:简单矩阵乘法

import numpy as np

# 输入向量(3 个特征)
x = np.array([1.0, 2.0, 3.0])           # shape: (3,)

# 权重矩阵(输入 3 → 输出 2)
W = np.array([[0.1, 0.2, 0.3],
              [0.4, 0.5, 0.6]])        # shape: (2, 3)

# 矩阵乘:y = W @ x
y = W @ x
print(y)  # [1.4 3.2]

这段代码实际上相当于 单层线性层(linear layer) 的计算。 PyTorch 迁移后:

import torch

x = torch.tensor([1.0, 2.0, 3.0])   # shape: (3,)
W = torch.tensor([[0.1, 0.2, 0.3],
                  [0.4, 0.5, 0.6]]) # shape: (2, 3)

y = W @ x
print(y)

形状与意义几乎相同。 熟悉 NumPy 矩阵运算 = 掌握深度学习公式


NumPy 与 PyTorch 的连接方式

1. Tensor 与 ndarray 是“表兄弟”关系

  • 两者都提供 n 维数组 + 向量化运算
  • shapereshapetransposesummean 等函数名与行为非常相似

因此,很多人把 NumPy 当作 练习 PyTorch 张量的练习场

2. 数据预处理通常采用 NumPy 风格

深度学习项目中常见的工作:

  • 读取 CSV、图像、日志等多种数据
  • 转换为数值型
  • 归一化、标准化、切片、打乱(shuffle)、分批

这些工作往往使用 NumPy + pandas 组合完成。

import numpy as np
import torch

# NumPy 中准备数据
np_data = np.random.randn(100, 3)  # 100 个样本,3 个特征

# 转为 PyTorch 张量
tensor_data = torch.from_numpy(np_data).float()
print(tensor_data.shape)  # torch.Size([100, 3])

反过来,把 PyTorch 张量再送回 NumPy 进行后处理也很常见。

y = tensor_data.mean(dim=0)  # PyTorch 张量
y_np = y.detach().cpu().numpy()

也就是说,NumPy 与 PyTorch 在实际工作中是不断往来

3. GPU 计算是 PyTorch,概念练习是 NumPy

  • PyTorch 张量可以在 GPU(CUDA)上运行,并支持自动微分
  • NumPy 基于 CPU,但 概念练习和调试更简单

因此,很多人会先用 NumPy 小规模实验想法或公式,验证后再迁移到 PyTorch 代码。


深度学习中常用的 NumPy 模式示例

1. 随机初始化 & 添加噪声

import numpy as np

# 权重初始化(正态分布)
W = np.random.randn(3, 3) * 0.01

# 给输入添加噪声
x = np.array([1.0, 2.0, 3.0])
noise = np.random.normal(0, 0.1, size=x.shape)
x_noisy = x + noise

2. 数据归一化(均值 0,标准差 1)

X = np.random.randn(100, 3) * 10 + 50  # 随机生成数据

mean = X.mean(axis=0)   # 每个特征的均值
std = X.std(axis=0)     # 每个特征的标准差

X_norm = (X - mean) / (std + 1e-8)

这种归一化在深度学习中对 性能和学习稳定性 有很大影响。

3. One-hot 编码

num_classes = 4
labels = np.array([0, 2, 1, 3])  # 4 个样本的类别索引

one_hot = np.eye(num_classes)[labels]
print(one_hot)
# [[1. 0. 0. 0.]
#  [0. 0. 1. 0.]
#  [0. 1. 0. 0.]
#  [0. 0. 0. 1.]]

PyTorch 也以类似方式处理 one-hot。

4. 批次划分

X = np.random.randn(100, 3)  # 100 个样本
batch_size = 16

for i in range(0, len(X), batch_size):
    batch = X[i:i+batch_size]
    # 这里可以想象把 batch 送进模型

这个模式与 PyTorch DataLoader 的概念直接对应。


学习 NumPy 时必须关注的要点

针对深度学习目标,不需要掌握所有功能。以下列表为核心,熟练掌握即可。

  1. ndarray 基础 * np.arraydtypeshapereshapeastype
  2. 索引 & 切片 * x[0]x[1:3]x[:, 0]x[:, 1:3] * 布尔索引:x[x > 0]
  3. 基本运算 * +-*/**、比较运算 * np.sumnp.meannp.maxnp.minaxis 概念
  4. 线性代数 * 矩阵乘:@np.dot * 转置:x.T
  5. 广播 * 标量加/乘 * (N, D) + (D,)(N, 1) 等模式
  6. 随机函数 * np.random.randnnp.random.randintnp.random.permutation
  7. PyTorch 关联 * torch.from_numpytensor.numpy() * 观察 shape 的对应关系

掌握以上内容后,在 PyTorch 教程中出现的大多数张量运算都会更自然


结语:NumPy 是“深度学习语法书”

总结:

  • NumPy 是 数值计算的多维数组库
  • PyTorch 的 Tensor 实际上是 NumPy ndarray 的深度学习版
  • 向量化、广播、线性代数 用 NumPy 学习后,
  • 更少遇到 shape 错误
  • 更容易把论文公式写成代码
  • 数据预处理/分析能力同步提升

如果你想从 框架使用 转向 数学/数组运算视角,NumPy 是最好的起点。

image of a dev researching deep-learning