np.diag()功能双模:输入2D数组提取主对角线,输入1D数组构造对角矩阵;取非主对角线用k参数;安全替代是ndarray.diagonal()。

diag函数怎么用:提取主对角线最简写法
np.diag() 是最直接的方案,但它有两个完全不同的行为模式——取决于输入是 1D 还是 2D 数组。这点不注意,结果会完全反直觉。
- 输入是 2D 数组(如
np.array([[1,2],[3,4]]))→ 返回主对角线元素组成的 1D 数组:[1, 4] - 输入是 1D 数组(如
np.array([1,4]))→ 反过来构造对角矩阵:[[1,0],[0,4]],不是你想要的提取操作 - 如果误把一维结果再喂给
np.diag(),会意外生成方阵,后续计算可能维度爆炸
提取非主对角线(k≠0):用k参数控制偏移
想取上对角线(右上)、下对角线(左下),靠 k 参数就行。正数向上偏移,负数向下偏移,这个方向和矩阵索引习惯一致,但容易记反。
-
k=0:默认主对角线(行索引 == 列索引) -
k=1:第一上对角线,即(0,1), (1,2), (2,3), ... -
k=-2:第二下对角线,即(2,0), (3,1), ... - 超出矩阵范围的
k不报错,返回空数组[],容易被忽略导致逻辑断裂
ndarray.diagonal() 和 np.diag() 的关键区别
两者都能取对角线,但行为边界不同:ndarray.diagonal() 是数组方法,只做提取;np.diag() 是函数,有“提取/构造”双重语义,更易踩坑。
-
a.diagonal(k=1)更安全,不会因输入形状变化而切换功能 -
a.diagonal()支持多维数组(如 3D),可指定两个轴用axis1/axis2参数,默认取最后两维的对角线 -
np.diag(a)对 3D 数组直接报错:ValueError: Input must be 1- or 2-d - 性能上无明显差异,但方法调用略少一次函数解析开销
常见错误现象与排查线索
实际写代码时,最常遇到的不是“取不到”,而是“取错了位置”或“形状突变”。错误信息往往不提示根本原因。
- 得到一个方阵而不是一维数组?检查是否误把 1D 结果又传给了
np.diag() - 结果长度比预期少?确认
k值是否超界,比如5x5矩阵中k=10返回空数组[] - 对 3D 数组调用
np.diag()报错?改用a.diagonal(axis1=0, axis2=2)明确指定轴 - 用
np.diag(a, k=1)时提示TypeError: diag() got an unexpected keyword argument 'k'?说明 NumPy 版本太老(.diagonal()
对角线提取本身很简单,但 np.diag() 的重载设计和 k 的方向感,是真正容易卡住人的地方。动手前先 print 一下输入数组形状和维度,比猜要快得多。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











