NumPy基础运算在深度学习中的应用:+、-、*、/、**、比较、sum/mean/max/min、axis
1. 为什么先掌握基础运算?
在深度学习中,我们最终要做的是:
- 对输入/权重进行加法(
+) - 进行乘法(
*、矩阵乘) - 应用非线性函数(
**、relu、sigmoid等) - 计算损失(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_t、x_t * 2、x_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.sum、np.mean、np.max、np.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 维特征
- 每个特征的均值(feature-wise mean)
mean_per_feature = np.mean(X, axis=0) # shape: (10,)
axis=0→ 在批次方向压缩- 结果是每列(特征)的平均
- 每个样本的均值(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)
- 整个批次的像素最大值
global_max = np.max(images) # 标量
- 通道均值(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. 小结:今天学到的基础运算
总结本篇内容:
- 算术运算(
+、-、*、/、**) * 默认是 逐元素 运算 * 与标量同样自然 - 比较运算(
>、<、>=、<=、==、!=) * 结果为布尔数组 * 可用作 掩码:过滤、计数、准确率等 - 聚合函数(
np.sum、np.mean、np.max、np.min) * 无axis时对整个数组求值 * 指定axis可按行/列/通道等压缩 axis概念 * 2D 中axis=0→ 列,axis=1→ 行 * 在深度学习中(batch, feature)、(N, C, H, W)结构下广泛使用 * 计算 feature-wise、sample-wise、channel-wise 统计
熟练掌握这些基础运算后,你就能像写数学公式一样,直接用 NumPy / PyTorch 代码实现损失、准确率、归一化等核心计算,复杂的张量运算也会变得不再陌生。

目前没有评论。