张量的 “轴” 可以理解为 维度的方向索引 。对于形状为 (2, 3, 4)
的张量,3 个轴的含义是:
可以类比成 “2 摞书,每摞有 3 页,每页有 4 个字”,3 个轴对应 “摞 → 页 → 字” 的层级。
求和(sum
)的核心逻辑是 对目标轴上的所有元素做聚合(相加),这会让该轴的 “长度坍缩为 1”,最终在形状里直接 “去掉该轴” 。
本质上,“轴” 只是维度的索引,求和操作通过 压缩目标轴的长度 改变形状,这是张量维度操作的基础逻辑,也和 “广播(Broadcasting)”、“降维(Reduce)” 等操作的原理相通。
沿轴求和属于降维操作,核心是通过 “压缩一个维度” 减少张量的维度数量或某一维度的长度,概念结合的角度解释:
原始张量X
是3 维(形状(2, 3, 4)
),沿任意轴求和后:
(3, 4)
)(2, 4)
)(2, 3)
)直观体现:3 维→2 维,维度数量减少了 1,这是典型的降维(从更高维数变为更低维数 )。
即使维度数量没变(比如 4 维张量沿中间轴求和),某一维度的长度会 “坍缩”:
假设张量形状是(2, 3, 4, 5)
,沿轴 1 求和后:
(2, 4, 5)
)沿轴求和时,把该轴上多个元素的信息聚合为 1 个(通过相加),导致该轴 “失去独立存在的意义”:
除了sum
,常见的降维操作还有:
mean
(沿轴求平均 ):同样压缩轴,维度数量 / 长度减少max
/min
(沿轴取最大 / 最小 ):也是聚合信息,降维flatten
(展平 ):直接把高维张量压成 1 维,是更极端的降维而sum
的特殊点在于通过加法聚合信息,本质上和这些操作一样,都是让张量的维度变少 / 某维度长度缩短,所以属于降维。
简单说:只要操作后,张量的维度数量减少,或者某一维度的长度从N>1
变成1
(甚至消失 ),都属于降维,沿轴求和完美符合这个特征,所以是降维操作。
import torch
# 创建一个形状为 (2, 3, 4) 的张量,每个元素是 1 到 24 的整数
X = torch.arange(1, 25).reshape(2, 3, 4)
print("原始张量 X 的形状:", X.shape)
print("X 的内容:\n", X)
# 沿轴 0 求和(压缩轴 0)
sum_axis0 = X.sum(axis=0)
print("\n沿轴 0 求和后的形状:", sum_axis0.shape)
print("沿轴 0 求和后的结果:\n", sum_axis0)
# 沿轴 1 求和(压缩轴 1)
sum_axis1 = X.sum(axis=1)
print("\n沿轴 1 求和后的形状:", sum_axis1.shape)
print("沿轴 1 求和后的结果:\n", sum_axis1)
# 沿轴 2 求和(压缩轴 2)
sum_axis2 = X.sum(axis=2)
print("\n沿轴 2 求和后的形状:", sum_axis2.shape)
print("沿轴 2 求和后的结果:\n", sum_axis2)
X
原始张量 X 的形状: torch.Size([2, 3, 4])
X 的内容:
tensor([[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]],
[[13, 14, 15, 16],
[17, 18, 19, 20],
[21, 22, 23, 24]]])
axis=0
)沿轴 0 求和后的形状: torch.Size([3, 4])
沿轴 0 求和后的结果:
tensor([[14, 16, 18, 20],
[22, 24, 26, 28],
[30, 32, 34, 36]])
X[0,0,0] + X[1,0,0] = 1+13=14
)。(3, 4)
。axis=1
)沿轴 1 求和后的形状: torch.Size([2, 4])
沿轴 1 求和后的结果:
tensor([[15, 18, 21, 24],
[51, 54, 57, 60]])
[1,2,3,4]
与第二行 [5,6,7,8]
、第三行 [9,10,11,12]
按列相加,得到 [15,18,21,24]
)。(2, 4)
。axis=2
)沿轴 2 求和后的形状: torch.Size([2, 3])
沿轴 2 求和后的结果:
tensor([[10, 26, 42],
[58, 74, 90]])
X[0,0] = [1,2,3,4]
求和得 10,X[0,1] = [5,6,7,8]
求和得 26)。(2, 3)
。用表格形式更直观地展示求和过程:
X
子张量 0:
┌───────┬───────┬───────┬───────┐
│ 1 │ 2 │ 3 │ 4 │
├───────┼───────┼───────┼───────┤
│ 5 │ 6 │ 7 │ 8 │
├───────┼───────┼───────┼───────┤
│ 9 │ 10 │ 11 │ 12 │
└───────┴───────┴───────┴───────┘
子张量 1:
┌───────┬───────┬───────┬───────┐
│ 13 │ 14 │ 15 │ 16 │
├───────┼───────┼───────┼───────┤
│ 17 │ 18 │ 19 │ 20 │
├───────┼───────┼───────┼───────┤
│ 21 │ 22 │ 23 │ 24 │
└───────┴───────┴───────┴───────┘
结果:
┌───────┬───────┬───────┬───────┐
│ 1+13 │ 2+14 │ 3+15 │ 4+16 │
├───────┼───────┼───────┼───────┤
│ 5+17 │ 6+18 │ 7+19 │ 8+20 │
├───────┼───────┼───────┼───────┤
│ 9+21 │ 10+22 │ 11+23 │ 12+24 │
└───────┴───────┴───────┴───────┘
子张量 0 结果:
┌───────────────────┐
│ 1+5+9 │ 2+6+10 │
├───────────────────┤
│ 3+7+11│ 4+8+12 │
└───────────────────┘
子张量 1 结果:
┌───────────────────┐
│ 13+17+21 │ 14+18+22 │
├───────────────────┤
│ 15+19+23 │ 16+20+24 │
└───────────────────┘
子张量 0 结果:
┌───────────┐
│ 1+2+3+4 │
├───────────┤
│ 5+6+7+8 │
├───────────┤
│ 9+10+11+12│
└───────────┘
子张量 1 结果:
┌──────────────┐
│ 13+14+15+16 │
├──────────────┤
│ 17+18+19+20 │
├──────────────┤
│ 21+22+23+24 │
└──────────────┘
k
求和:将该轴上的所有元素相加,导致该轴的长度 从 N
坍缩为 1,最终形状中 去掉轴 k
。