Skip to main content

张量和矩阵的关系

Tensor 的ndim 就是阶数,shape=(10, 2)、ndim=2 的张量,本质就是一个10*2矩阵。

创建一个 (10, 2) 的张量

import torch

t = torch.tensor([
[1.0, 2.0],
[3.0, 4.0],
[5.0, 6.0],
[7.0, 8.0],
[9.0, 10.0],
[11.0, 12.0],
[13.0, 14.0],
[15.0, 16.0],
[17.0, 18.0],
[19.0, 20.0],
])

print(t)
print("shape:", t.shape)
print("ndim :", t.ndim)
print("numel:", t.numel())

输出:

tensor([[ 1.,  2.],
[ 3., 4.],
[ 5., 6.],
[ 7., 8.],
[ 9., 10.],
[11., 12.],
[13., 14.],
[15., 16.],
[17., 18.],
[19., 20.]])
shape: torch.Size([10, 2])
ndim : 2
numel: 20

这就是"嵌套"的样子​

  • 最外层 [...]:包住 10 个元素
  • 里面每个元素又是一个 [...]:各有 2 个数字

人类看起来是"10 个长度 2 的列表嵌套在一起"。


但它底层不是嵌套的​

PyTorch 内部其实是一段连续的 20 个数:

print(t.flatten())
# tensor([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.,
# 11., 12., 13., 14., 15., 16., 17., 18., 19., 20.])

再配合 shape=(10, 2) 和 stride=(2, 1),PyTorch 就知道"怎么把它读成 10 行 2 列":

print("stride:", t.stride())   # (2, 1)
  • stride=(2, 1) 意思是:
    • 行号 +1 → 内存下标 +2
    • 列号 +1 → 内存下标 +1

所以 t[3][1](第 4 行第 2 列)= 内存下标 3*2 + 1 = 7 = 数值 8.0。验证一下:

print(t[3, 1])    # tensor(8.)

顺带对比不同阶数​

a = torch.tensor([1.0, 2.0, 3.0])              # 1 阶, shape (3,)
b = torch.tensor([[1.0, 2.0], [3.0, 4.0]]) # 2 阶, shape (2, 2)
c = torch.tensor([[[1.0, 2.0], [3.0, 4.0]],
[[5.0, 6.0], [7.0, 8.0]]]) # 3 阶, shape (2, 2, 2)

print(a.ndim, b.ndim, c.ndim) # 1 2 3
print(a.shape, b.shape, c.shape)

方括号嵌套的层数 = 张量的阶数,这只是书写约定,不是内存结构。


两个"阶"的对比​

出处"阶"指什么英文例子
线性代数方阵的边长 norder (of a square matrix)3 阶方阵 = 3×3
张量/深度学习张量的维度数rank / order / ndim2 阶张量 = 矩阵

总结​

torch.tensor([[...], [...], ...]) 只是书写成嵌套的样子;创建出来的 t 是 shape=(10, 2)、ndim=2 的张量,底层是一段长度为 20 的连续内存。数学上它就是 (10, 2) 的矩阵。