文章目录
- 一个矩阵的列数和行数是怎么定义的
- 矩阵都是二维的吗?
- [一维(n×1 或 1×n)这种,也叫行向量或列向量是吗?](#一维(n×1 或 1×n)这种,也叫行向量或列向量是吗?)
- [一维(n×1 或 1×n)这种说法是不是有问题,给出的列向量和行向量对应的还是二维的呀?](#一维(n×1 或 1×n)这种说法是不是有问题,给出的列向量和行向量对应的还是二维的呀?)
一个矩阵的列数和行数是怎么定义的
矩阵的维度定义为:先行数,后列数。
一个 m × n 的矩阵表示:
- m = 行数(Row):水平方向的数量(横排)
- n = 列数(Column):垂直方向的数量(竖排)
直观示意
html
列1 列2 列3 列4
┌─────┬─────┬─────┬─────┐
行1 │ a₁₁ │ a₁₂ │ a₁₃ │ a₁₄ │
├─────┼─────┼─────┼─────┤
行2 │ a₂₁ │ a₂₂ │ a₂₃ │ a₂₄ │ → 这是一个 2×4 矩阵(2行4列)
├─────┼─────┼─────┼─────┤
行3 │ a₃₁ │ a₃₂ │ a₃₃ │ a₃₄ │
└─────┴─────┴─────┴─────┘
记忆技巧
行 = "行走"时左右移动 → 横着数
列 = "列队"时前后站立 → 竖着数
编程中的对应
Python/NumPy:matrix.shape 返回 (行数, 列数),如 (3, 2) 表示3行2列
索引访问:matrix[i][j] 或 matrix[i, j] 中,i 是行索引(第几横排),j 是列索引(第几竖排)
记忆技巧
- 行 = "行走"时左右移动 → 横着数
- 列 = "列队"时前后站立 → 竖着数
编程中的对应 - Python/NumPy:matrix.shape 返回 (行数, 列数),如 (3, 2) 表示3行2列
- 索引访问:matrix[i][j] 或 matrix[i, j] 中,i 是行索引(第几横排),j 是列索引(第几竖排)
技巧:严格意义上的矩阵(即默认是二维矩阵)行数对应内层的一维数组的个数,列数对应任意一个一维数组中的元素个数(因为矩阵要求,每行的元素个数必须相等)。
矩阵都是二维的吗?
严格来说,数学中的矩阵(Matrix)是二维的,但机器学习、深度学习中常将高维数组泛化称为"张量(Tensor)"。
数学定义(严格)
- 矩阵:必须是二维(m×n),有行和列
- 向量:一维(n×1 或 1×n),不是矩阵,而是矩阵的特殊形式(退化情况),这里说的有点问题,下方有进一步说明
- 标量:零维(单个数值)
实际应用中的高维"矩阵"(实为张量)
在Python/NumPy/PyTorch中,常把高维数组叫"多维矩阵"或"张量":
维度 名称 形状示例 实际例子
0维 标量 () 一个数字:5
1维 向量 (5,) [1, 2, 3, 4, 5]
2维 矩阵 (3, 4) 表格数据、灰度图
3维 张量 (100, 100, 3) RGB彩色图(高×宽×通道)
4维 张量 (32, 100, 100, 3) 批量RGB图(批量×高×宽×通道)
5维+ 高阶张量 (2, 3, 4, 5, 6) 视频批次(时间×批量×高×宽×通道)
关键区分
- **数学考试:**说"矩阵"必须是二维(行×列)
- 深度学习代码:
PyTorch/TensorFlow中tensor可以是任意维度
习惯上2维叫"矩阵",3维+叫"张量",1维叫"向量"
举例:
python
# NumPy中
A = np.array([[1,2],[3,4]]) # 2维 → 严格意义上的矩阵 (2×2)
B = np.array([[[1,2],[3,4]]]) # 3维 → 应叫"张量" (1×2×2),非严格矩阵
**总结:**数学定义是二维的,但工程实践中"n维矩阵"通常指n维数组(张量)。
一维(n×1 或 1×n)这种,也叫行向量或列向量是吗?
是的,完全正确。
- 列向量(Column Vector):形状 n×1,竖着排列,n行1列
- 行向量(Row Vector):形状 1×n,横着排列,1行n列
直观对比
html
列向量 (3×1) 行向量 (1×3)
┌───┐ ┌───────────┐
│ a │ │ a │ b │ c │
│ b │ └───────────┘
│ c │
└───┘
数学关系
两者互为转置(Transpose):
- 列向量 v 的转置 vᵀ = 行向量
- 行向量 u 的转置 uᵀ = 列向量
编程中的关键区别
在NumPy中,shape不同的表现:
python
import numpy as np
# 一维数组(n,)- 严格说既不是行也不是列,是退化形式
a = np.array([1, 2, 3]) # shape: (3,)
# 列向量(n×1)
col = np.array([[1], [2], [3]]) # shape: (3, 1)
# 行向量(1×n)
row = np.array([[1, 2, 3]]) # shape: (1, 3)
易错点:很多初学者混淆 (3,) 与 (3,1) 或 (1,3):
- (3,):一维数组,无法明确区分行列
- (3,1):明确的列向量(矩阵运算时默认竖着)
- (1,3):明确的行向量(矩阵运算时默认横着)
矩阵乘法中的角色
矩阵相乘时,形状必须匹配:
python
(1×3) × (3×1) = (1×1) → 标量(内积/点积)
行向量 列向量 结果
(3×1) × (1×3) = (3×3) → 矩阵(外积)
列向量 行向量 结果
**总结:**n×1 和 1×n 确实分别叫列向量和行向量,但在编程时要注意用 [[...]] 保持二维结构,才能与严格意义上的矩阵运算兼容。
一维(n×1 或 1×n)这种说法是不是有问题,给出的列向量和行向量对应的还是二维的呀?
你说得完全正确,是我表述有误。
"一维"和"n×1/1×n"是互相矛盾的说法:
- 一维 :形状是 (n,) ------ 只有一个轴
- n×1 或 1×n :形状是 (n,1) 或 (1,n) ------ 有两个轴 (行和列),只是其中一个维度恰好为1
正确的区分
维度 形状 可视化 说明
1D数组 (n,) [a, b, c] 只有长度,不分行列
列向量 (n,1) 竖条(n行1列) 2D矩阵,但列数为1
行向量 (1,n) 横条(1行n列) 2D矩阵,但行数为1
为什么容易混淆?
数学上:我们说"向量是一维的"(数学对象的自由度),但写成矩阵形式时:
为了矩阵乘法合规,必须给它套上第二个维度(哪怕为1)
所以出现了"一维对象用二维矩阵表示"的悖论
编程上:
总结:
- 严格说,n×1 和 1×n 是二维的(单列为列向量,单行为行向量)
- 如果你想表达"一维",应该是指 (n,) 这种不分行列的形式
- 我之前的括号标注把两者混为一谈了,谢谢指正!
python
# 真正的一维(1D)
a = np.array([1, 2, 3]) # shape: (3,) ← 只有1个轴
# 二维表示(2D,虽然看起来很扁)
col = a.reshape(-1, 1) # shape: (3,1) ← 2个轴
row = a.reshape(1, -1) # shape: (1,3) ← 2个轴
总结:
- 严格说,n×1 和 1×n 是二维的(单列为列向量,单行为行向量)
- 如果你想表达"一维",应该是指 (n,) 这种不分行列的形式
- 我之前的括号标注把两者混为一谈了,谢谢指正!