【小白笔记】在 PyTorch 和 NumPy 这样的张量库中,形状(Shape) (3,) 的真正含义
非常常见的误解!在 PyTorch 和 NumPy 这样的张量库中,形状(Shape)的表示方式与您在线性代数中对矩阵的视觉习惯有所不同。
人话解释:
在 PyTorch 和 NumPy 中,形状 (3,)
绝对不是“三行一列”的意思。它表示一个纯粹的一维数组,它没有“行”和“列”的概念。
1. 形状 (3,)
的真正含义
形状表示 | 含义 | 维度 | 形象化 |
---|---|---|---|
(3,) | 一维数组,总共 3 个元素。 | 1 维 | 像一个 Python 列表:[e1, e2, e3] |
- 没有方向: 当形状只有一项时(如
(N,)
),它是一个向量。它既不是行向量,也不是列向量,因为它没有第二个维度来定义方向。
2. 如何表示“三行一列”?
要表示一个明确的“三行一列”的结构(即数学上的列向量或矩阵),它必须是二维的。
形状表示 | 含义 | 维度 | 形象化 |
---|---|---|---|
(3, 1) | 二维数组,有 3 行,每行 1 列。 | 2 维 | 像一个列向量:(e1e2e3)\begin{pmatrix} e_1 \\ e_2 \\ e_3 \end{pmatrix}e1e2e3 |
(1, 3) | 二维数组,有 1 行,每行 3 列。 | 2 维 | 像一个行向量:(e1e2e3)\begin{pmatrix} e_1 & e_2 & e_3 \end{pmatrix}(e1e2e3) |
3. 回到 unsqueeze(0)
的作用
正因为原始的 x_new
形状是 (3,)
(一个无方向的向量), PyTorch 不知道怎么用它来对齐训练集 XtrainX_{\text{train}}Xtrain 的每一行。
执行 x_new.unsqueeze(0)
后:
xnew形状 (3,)→unsqueeze(0)xnew_expanded形状 (1,3)\mathbf{x}_{\text{new}} \text{ 形状 } (3,) \xrightarrow{\text{unsqueeze}(0)} \mathbf{x}_{\text{new\_expanded}} \text{ 形状 } (1, 3)xnew 形状 (3,)unsqueeze(0)xnew_expanded 形状 (1,3)
- 我们把它明确地变成了 1 行、3 列的结构。
- 这个
(1, 3)
的形状才能与训练集 XtrainX_{\text{train}}Xtrain 的(N, 3)
形状在广播机制下成功对齐。
核心记忆点: 在 PyTorch/NumPy 中,形状中包含的数字个数就是张量的维度。
- 一个数字:
(N,)
→ 一维。 - 两个数字:
(N, M)
→ 二维(矩阵,有行有列)。 (3,) \ne (3, 1)
。