NumPy基础运算在深度学习中的应用:+-*/**、比较、sum/mean/max/minaxis

1. 为什么先掌握基础运算?



在深度学习中,我们最终要做的是:

  • 对输入/权重进行加法(+
  • 进行乘法(*、矩阵乘)
  • 应用非线性函数(**relusigmoid 等)
  • 计算损失(loss)后, 对其取 平均(mean求和(sum

PyTorch 的张量运算 完全遵循 NumPy 的基础运算风格,因此先在 NumPy 中熟悉这些运算感受,后续在深度学习公式中会更直观。


2. 元素级算术运算:+-*/**

NumPy 数组之间的基本运算是 逐元素(element-wise) 的。

import numpy as np

x = np.array([1, 2, 3])
y = np.array([10, 20, 30])

print(x + y)   # [11 22 33]
print(x - y)   # [ -9 -18 -27]
print(x * y)   # [10 40 90]
print(y / x)   # [10. 10. 10.]
print(x ** 2)  # [1 4 9]
  • 长度相同的一维数组按元素相加
  • 二维、三维数组同理,位置对应相加

2.1 与标量的运算

与单个数值(标量)相运算也很自然。

x = np.array([1, 2, 3])

print(x + 10)   # [11 12 13]
print(x * 2)    # [2 4 6]
print(x / 2)    # [0.5 1.  1.5]

这种 “对所有元素加/乘同一数” 的操作在深度学习中常用于 归一化、缩放、偏置添加 等。

PyTorch 张量同样支持。 x_t + y_tx_t * 2x_t ** 2 等表达几乎可以直接使用。


3. 比较运算:><>=<===!=



NumPy 数组之间的比较运算返回 布尔(Boolean)数组

import numpy as np

x = np.array([1, 2, 3, 4, 5])

print(x > 3)   # [False False False  True  True]
print(x == 2)  # [False  True False False False]

这个布尔数组可以:

  • 作为 掩码(mask) 选取特定元素
  • 统计满足条件的元素个数

示例:

x = np.array([1, -2, 3, 0, -5, 6])

mask = x > 0
print(mask)          # [ True False  True False False  True]

# 只取正数
pos = x[mask]
print(pos)           # [1 3 6]

# 正数个数
num_pos = np.sum(mask)   # True 视为 1,False 视为 0
print(num_pos)           # 3

在深度学习中常见:

  • 计算 准确率(accuracy):预测正确的样本比例
  • 只将满足条件的样本计入损失

PyTorch 也使用完全相同的模式。


4. 聚合函数:np.sumnp.meannp.maxnp.min

4.1 无 axis:对整个数组求值

默认情况下,对 整个数组 进行求和、平均、最大、最小。

import numpy as np

x = np.array([1, 2, 3, 4])

print(np.sum(x))   # 10
print(np.mean(x))  # 2.5
print(np.max(x))   # 4
print(np.min(x))   # 1

二维及以上数组同理。

X = np.array([[1, 2, 3],
              [4, 5, 6]])

print(np.sum(X))   # 21
print(np.mean(X))  # 3.5

在深度学习中:

  • 计算 整个批次/整个数据集 的平均损失
  • 先求平均/标准差再做归一化

5. 理解 axis

axis 用来指定 沿哪个轴进行运算

  • 未指定 → 对所有元素求值
  • 指定 → 在该轴上压缩(reduce),保留其余轴

5.1 2D 示例

import numpy as np

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

axis=0:按列(下行)求值

print(np.sum(X, axis=0))   # [5 7 9]
print(np.mean(X, axis=0))  # [2.5 3.5 4.5]
  • 结果 shape: (3,)
  • 每列的和/平均
  • 在深度学习中常用于 每个特征的均值/标准差 计算

axis=1:按行(横跨)求值

print(np.sum(X, axis=1))   # [ 6 15]
print(np.mean(X, axis=1))  # [2. 5.]
  • 结果 shape: (2,)
  • 每行的和/平均
  • 对应 每个样本的总和/平均

5.2 深度学习中常见的 axis 示例

假设批量数据为:

# (batch_size, feature_dim)
X = np.random.randn(32, 10)  # 32 个样本,10 维特征
  1. 每个特征的均值(feature-wise mean)
mean_per_feature = np.mean(X, axis=0)  # shape: (10,)
  • axis=0 → 在批次方向压缩
  • 结果是每列(特征)的平均
  1. 每个样本的均值(sample-wise mean)
mean_per_sample = np.mean(X, axis=1)  # shape: (32,)
  • axis=1 → 在特征方向压缩
  • 结果是每行(样本向量)的平均值

5.3 图像批次中的 axis

以 PyTorch 风格 (N, C, H, W) 为例。

# N=32, C=3 (RGB), H=W=64
images = np.random.randn(32, 3, 64, 64)
  1. 整个批次的像素最大值
global_max = np.max(images)  # 标量
  1. 通道均值(RGB 通道均值)
# axis=(0, 2, 3): 在批次、高度、宽度方向压缩,只保留通道
channel_mean = np.mean(images, axis=(0, 2, 3))  # shape: (3,)

这正是 通道归一化 时常用的模式。


6. 聚合函数 + 比较运算:常用模式

6.1 准确率(accuracy)计算

以二分类为例:

import numpy as np

# 预测(假设为 0~1 的概率)
pred = np.array([0.2, 0.8, 0.9, 0.3])
# 正确标签(0 或 1)
target = np.array([0, 1, 1, 0])

# 0.5 作为阈值生成预测标签
pred_label = (pred > 0.5).astype(np.int32)   # [0 1 1 0]

# 正确的为 True
correct = (pred_label == target)             # [ True True True True]

accuracy = np.mean(correct)                  # True=1, False=0
print(accuracy)  # 1.0
  • 比较运算 → 布尔数组
  • mean 即为准确率

PyTorch 也几乎相同。

6.2 用掩码计算损失

loss = np.array([0.1, 0.5, 0.2, 0.9])
mask = np.array([True, False, True, False])

masked_loss = loss[mask]      # [0.1, 0.2]
mean_loss = np.mean(masked_loss)
print(mean_loss)              # 0.15000000000000002

只包含满足条件的样本进行损失计算时,NumPy + 掩码 + 聚合函数 的组合非常常见。


7. 小结:今天学到的基础运算

总结本篇内容:

  1. 算术运算(+-*/** * 默认是 逐元素 运算 * 与标量同样自然
  2. 比较运算(><>=<===!= * 结果为布尔数组 * 可用作 掩码:过滤、计数、准确率等
  3. 聚合函数(np.sumnp.meannp.maxnp.min * 无 axis 时对整个数组求值 * 指定 axis 可按行/列/通道等压缩
  4. axis 概念 * 2D 中 axis=0 → 列,axis=1 → 行 * 在深度学习中 (batch, feature)(N, C, H, W) 结构下广泛使用 * 计算 feature-wisesample-wisechannel-wise 统计

熟练掌握这些基础运算后,你就能像写数学公式一样,直接用 NumPy / PyTorch 代码实现损失、准确率、归一化等核心计算,复杂的张量运算也会变得不再陌生。

image