Skip to content

数据的形状 -- 标量、向量、矩阵、张量

在 AI 的世界里,所有数据——无论是一张图片、一段文字、还是一段音频——最终都被组织成一种统一的形式:张量(Tensor)

张量是一个统称,按照维度的不同,它有不同的名字。

从零维到多维:层层嵌套的数据结构

标量 Scalar

26

0 维:就是一个单独的数

无需坐标定位

向量 Vector

[22, 23, 24, 26]

1 维:一串有序的数

1 个坐标:第几个?

矩阵 Matrix

2D 表格

2 维:行和列组成的表格

2 个坐标:第几行?第几列?

张量 Tensor

数据立方体

3 维及以上:多层表格叠放

3+ 个坐标定位一个数

另一种理解方式是「嵌套」——标量在最里面,外面套一层变成向量,再套一层变成矩阵,继续套就是更高维的张量。

张量:一摞表

矩阵:一张表

向量:一行数字

标量:一个数

在 PyTorch 和 TensorFlow 等深度学习框架中,所有数据统一用「张量(Tensor)」来表示。

标量是 0 维张量,向量是 1 维张量,矩阵是 2 维张量——它们是张量的特殊情况。

用维度(Dimension)理解数据的形状

标量(0 维)

就是一个数。比如气温 26°C。在 NumPy 中 shape 显示为空元组 ()

向量(1 维)

一串有序的数。比如一天中每小时的气温记录。Shape 为 (n,),n 是元素个数。

矩阵(2 维)

一张表格,有行和列。比如一周七天、每天 24 小时的气温表。Shape 为 (行数, 列数)

张量(3 维及以上)

多层数据叠放。比如全国 300 个城市、每个城市一周 7 天、每天 24 小时的气温。Shape 为 (城市数, 天数, 小时数)(300, 7, 24)

维度可以简单理解为:你需要几个「坐标」才能锁定一个具体的数。


生活例子

下面用一个递进的场景来巩固理解。

场景一:记录此刻气温

你只需要写下一个数:26。这就是一个 标量。它没有维度,就是一个孤零零的值。

场景二:记录一天的气温变化

你从早到晚每小时测一次,得到 24 个数:[22, 23, 24, 26, 28, ...]

这是一个 向量。你需要一个坐标(第几个小时)来定位某个温度值。

场景三:记录一周的气温

你把七天的数据列成一张表格:每行是一天,每列是一个小时。

这是一个 7 行 24 列的 矩阵。你需要两个坐标(第几天、第几小时)来定位。

场景四:记录全国城市的气温

全国 300 个城市,每个城市都有一张 7×24 的表格。

这 300 张表格叠在一起,形成一个 3D 张量。你需要三个坐标(哪个城市、第几天、第几小时)。


数学定义

标量 Scalar

标量是一个单独的数,记作 $ a = 26 $,或者 $ x \in \mathbb{R} $(x 属于实数集)。

向量 Vector

向量是一组有序的数,通常竖着写(列向量):

v=[v_1v_2v_n]Rn

$ \mathbb{R}^{n} $ 表示这是一个 n 维实数向量,$ v_1 $ 是第 1 个分量,$ v_n $ 是第 n 个分量。

矩阵 Matrix

矩阵是一个 m 行 n 列的矩形数组:

A=[a_11a_12a_1na_21a_22a_2na_m1a_m2a_mn]Rm×n

记作 m×n 矩阵(m 行 n 列),$ a_{ij} $ 表示第 i 行第 j 列的元素。

张量 Tensor

张量是向量和矩阵向任意维度的推广。

一个 k 维张量的形状记作 $ (d_1, d_2, \dots, d_k) $,共 $ d_1 \times d_2 \times \cdots \times d_k $ 个元素。

对比速查表

名称维度Shape 示例坐标数数学记号
标量0()0$ x \in \mathbb{R} $
向量1(n,)1$ \mathbf{v} \in \mathbb{R}^{n} $
矩阵2(m, n)2$ \mathbf{A} \in \mathbb{R}^{m \times n} $
3D 张量3(d1, d2, d3)3$ \mathcal{T} \in \mathbb{R}^{d_1 \times d_2 \times d_3} $

Python 动手实践

下面用 NumPy 来创建和查看这些数据结构。shape 属性 是理解数据维度的关键。

实例

python

import numpy as np

# 标量(0 维张量):shape = ()

scalar = np.array(26)

# 向量(1 维张量):shape = (n,)

vector = np.array([22, 23, 24, 26, 28, 30, 31, 29])

# 矩阵(2 维张量):shape = (行数, 列数)

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

# 3D 张量:shape = (层数, 行数, 列数)

tensor_3d = np.array([[[1,2,3],[4,5,6]], [[7,8,9],[10,11,12]]])

# 4D 张量:模拟 3 张 2x2 像素的单通道图片

batch_images = np.array([

    [[[10],[20]],[[30],[40]]],

    [[[50],[60]],[[70],[80]]],

    [[[90],[100]],[[110],[120]]]

])

print("标量:    shape=", scalar.shape, "   ndim=", scalar.ndim)

print("向量:    shape=", vector.shape, "   ndim=", vector.ndim)

print("矩阵:    shape=", matrix.shape, "   ndim=", matrix.ndim)

print("3D 张量: shape=", tensor_3d.shape, "  ndim=", tensor_3d.ndim)

print("4D 张量: shape=", batch_images.shape, " ndim=", batch_images.ndim)

运行输出:

python
标量:    shape= ()        ndim= 0
向量:    shape= (8,)      ndim= 1
矩阵:    shape= (2, 3)    ndim= 2
3D 张量: shape= (2, 2, 3) ndim= 3
4D 张量: shape= (3, 2, 2, 1) ndim= 4

Shape 属性的规律

属性含义标量向量(8个元素)矩阵(2×3)3D(2×2×3)
.shape每个维度的大小()(8,)(2, 3)(2, 2, 3)
.ndim维度数量 = len(shape)0123
.size元素总数18612

调试深度学习代码时,看到 shape mismatch 报错,第一步就是打印 shape 查看数据维度。

理解 shape 是学习 NumPy 和所有深度学习框架的第一技能。


张量三维可视化

下面把 3×3×3 张量画成空间中的 27 个点:三个坐标轴分别对应"行、列、通道",每个点的颜色深浅代表该位置的数值大小。拖动鼠标可以旋转视角。

3×3×3 张量的空间分布 · 颜色越亮代表数值越大

注意观察:固定"通道"这一层不变,你会看到一个 3×3 的平面——那正是一个二阶张量(矩阵)。这也是为什么我们说"矩阵是张量的一个特例"。


AI 中的应用场景

图像分类:从 3D 到 4D 张量

ImageNet 分类任务中,输入图片被统一缩放到 224×224 像素。单张彩色图片是 shape 为 (224, 224, 3) 的 3D 张量。

实际训练时,GPU 一次处理一个 batch(如 32 张图片),数据变为 4D 张量 (32, 224, 224, 3)

注意不同框架的通道位置约定不同:TensorFlow/Keras 使用 (N, H, W, C)(通道在最后),PyTorch 使用 (N, C, H, W)(通道在最前)。

当你看到报错 "shape mismatch: (32, 224, 224, 3) vs (32, 3, 224, 224)",就是通道位置不一致导致的——用 .permute().transpose() 调整即可。

自然语言处理:嵌入矩阵

BERT 模型的词表大小为 30522,隐藏维度为 768。它的词嵌入矩阵 shape 为 (30522, 768)——每行是一个词的 768 维向量。

GPT 系列也是如此:GPT-2 的词表 50257,嵌入维度 768(小模型)到 1600(大模型)。

当你输入一段文本,模型首先查表把每个词 ID 转成对应的嵌入向量,这就是「查表取行」——一个矩阵索引操作。

全连接层:矩阵乘法的核心地位

一个经典的 MNIST 手写数字识别网络:输入 784 维(28×28 像素展平),第一隐藏层 256 维。

权重矩阵 W₁ 的 shape 为 (256, 784)。每次前向传播计算 h = W₁ @ x,就是 256×784 矩阵乘 784 维向量。

整个神经网络的前向传播,本质上就是一层层的矩阵乘法和激活函数的交替。

视频数据:5D 张量

视频可以理解为多帧图片的序列。一段 16 帧的 224×224 彩色视频片段,shape 为 (16, 224, 224, 3)

加上 batch 维度后变成 5D 张量 (8, 16, 224, 224, 3)——这就是视频分类模型(如 3D-ResNet)的标准输入。


AI 思考中...

AI 数学基础

向量的加法与数乘 — 几何视角

基于 VitePress 构建,部署于 GitHub Pages