用np.array创建矩阵需注意维度对齐:一维数组非向量,行向量用[[1,2,3]](shape(1,3)),列向量用[[1],[2],[3]](shape(3,1));矩阵乘优先用@而非np.dot或*;求逆等操作前须验证方阵且满秩;广播需显式控制形状。

用 np.array 创建矩阵时,别忘了维度对齐
Python 里没有原生矩阵类型,np.array 是起点,但它的行为和数学矩阵不完全一致。比如 np.array([1, 2, 3]) 默认是一维数组(shape 是 (3,)),不是行向量或列向量——这会导致后续点乘报错 ValueError: matmul: Input operand 1 has a mismatch in its core dimension。
实操建议:
- 明确向量方向:行向量用
np.array([[1, 2, 3]])(shape(1, 3)),列向量用np.array([[1], [2], [3]])(shape(3, 1)) - 二维矩阵优先用双层中括号,避免
np.matrix(已弃用,且与np.array混用易出错) - 不确定 shape 时,随时打印
a.shape,比猜更可靠
@ 运算符和 np.dot 都能做矩阵乘,但优先用 @
Python 3.5+ 引入了 @ 作为矩阵乘法专用运算符,语义清晰、可读性高,且和 MATLAB / 数学表达习惯一致;而 np.dot 在一维数组上做内积、二维上做矩阵乘,行为不统一,容易误用。
常见错误现象:
- 用
np.dot(a, b)处理三维张量时逻辑混乱(它会做“batch 内积”,不是你想的批量矩阵乘) - 混用
*和@:*是逐元素乘(broadcasting),不是矩阵乘
示例对比:
import numpy as np a = np.array([[1, 2], [3, 4]]) b = np.array([[0, 1], [1, 0]]) print(a @ b) # ✅ 推荐:[[2 1] [4 3]] print(np.dot(a, b)) # ⚠️ 可用但冗余,同上 print(a * b) # ❌ 逐元素:[[0 2] [3 0]]
求逆、转置、特征值这些操作,注意输入必须是方阵且可逆
np.linalg.inv、np.linalg.eig 等函数只接受二维方阵(shape (n, n))。传入非方阵会直接抛 LinAlgError: Last 2 dimensions of the array must be square;传入奇异矩阵(如全零、行列式为 0)则可能报 Singular matrix 或返回数值不稳定的结果。
实操建议:
- 调用前先检查:
if a.shape[0] == a.shape[1]:,再用np.linalg.matrix_rank(a) == a.shape[0]判断是否满秩 - 转置统一用
a.T(简洁安全),别用np.transpose(a)或a.transpose()—— 后两者在多维时行为不同,容易踩坑 - 解线性方程组优先用
np.linalg.solve(A, b),比先算逆再乘np.linalg.inv(A) @ b更快更稳
广播机制让向量-矩阵运算变简单,但也容易隐式出错
NumPy 的广播(broadcasting)允许 (m, n) 矩阵和 (n,) 向量直接相加(如 A + v),自动将向量扩展为每行相同值。这很实用,但若维度没对齐,会静默失败或结果错位。
典型问题:
-
A + v中v是(m,)而非(n,),结果变成按列加(而非按行),却不会报错 - 想对每列减去均值,写成
A - A.mean(axis=0)是对的;但若误写A - A.mean(axis=1),就会因广播形状不匹配触发异常
建议始终显式控制广播方向:用 reshape(-1, 1) 强制列向量,或 [:, None],比如:
v_col = A.mean(axis=0).reshape(-1, 1) # (n,) → (n, 1) centered = A - v_col # 安全地按列中心化
矩阵运算真正麻烦的地方不在公式本身,而在 shape 的隐式转换和广播的静默行为——多打一行 print(x.shape) 花不了两秒,但能省掉半小时调试。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











