·
日常编程 ·
156198
np.diag 提取主对角线最简单,但输入为一维数组时会生成对角矩阵而非提取对角线;需确认 arr.ndim == 2 或先用 np.atleast_2d(arr);k 参数控制偏移,有效范围为 -(m-1) ≤ k ≤ n-1。
直接用 np.diag 提取主对角线最简单,但别默认它只返回一维数组
调用 np.diag 时,如果输入是二维数组(如 ndarray),它默认提取主对角线并返回一维 ndarray;但如果输入是一维数组,它反而会生成对角矩阵。这个行为容易混淆,尤其在链式操作中意外把向量当矩阵传进去,结果得到一个方阵而非预期的对角元素列表。
- 确认输入维度:
arr.ndim == 2 才能安全提取对角线
- 若不确定,先用
np.atleast_2d(arr) 包裹再调用 np.diag
- 注意返回值类型:总是
ndarray,不是 Python list,切片或索引仍需用 NumPy 方式
np.diag 的 k 参数控制偏移,正数向上、负数向下
k 是关键偏移参数:当 k=0(默认)取主对角线;k=1 取主对角线上方第一条(即第 0 行第 1 列开始);k=-2 取主对角线下方第二条(即第 2 行第 0 列开始)。实际提取范围受矩阵形状限制,超出部分自动截断,不报错也不补零。
- 对于形状为
(m, n) 的矩阵,有效 k 范围是 -(m-1)
-
np.diag(arr, k=5) 在 4×4 矩阵上返回空数组 array([]),不是错误
- 若需固定长度结果(如补零),得手动处理,
np.diag 不提供填充选项
想同时取多条对角线?np.diag 不行,得换思路
np.diag 每次只能取一条对角线。要批量提取(比如主对角线 + 上下各一条),不能靠多次调用再拼接——效率低且难对齐。更稳的方式是用高级索引构造坐标:
import numpy as np
arr = np.arange(16).reshape(4, 4)
k_values = [-1, 0, 1]
diags = [np.diag(arr, k=k) for k in k_values]
但注意:这些结果长度不同(例如 k=-1 和 k=1 在非方阵中可能差 1),直接 np.stack 会失败。真要对齐,得先算每条长度:min(m + k, n - k)(对 k >= 0),再统一截断或补零。
性能敏感场景慎用 np.diag,主对角线可用视图替代
如果只取主对角线(k=0)且后续还要修改原矩阵对应位置,np.diag 返回的是副本,改了没用。此时应直接用 np.arange 配合花式索引获取视图:
diag_view = arr[np.arange(min(arr.shape)), np.arange(min(arr.shape))]
这个 diag_view 是原数组的视图,修改它等于修改原矩阵对角线元素。而 np.diag(arr) 总是拷贝。另外,在循环中高频调用 np.diag(尤其小矩阵)会有明显函数调用开销,预计算索引数组更快。
偏移对角线无法用纯视图实现,必须拷贝,这是 np.diag 不可绕过的成本。
应直接使用 calendar.isleap() 判断闰年,它准确实现公历规则、线程安全、性能优且自 Python 2.3 起稳定兼容,避免手写逻辑出错或误用类型。 直接用 calendar.isleap() 判定闰年,别自己写逻辑 Python 的 calendar.isleap() 是最可靠、最省事的闰年判断方式。它封装了格里高利历(公历)全部规则:能被 4 整除但不能被 100 整除,或能被 ...
本文介绍一种高效、向量化的方法,替代低效的循环 pd.concat,从原始 DataFrame 中按子集索引批量提取长度为 n 的连续行段,尤其适用于单列选取场景,避免因误用 .iloc 与 [] 操作符导致的索引对齐错误和 NaN 问题。 本文介绍一种高效、向量化的方法,替代低效的循环 `pd.concat`,从原始 dataframe 中按子集索引批量提取长度为 `n` 的连续行段,尤其适用于...
使用 NumPy 的 np.matmul 可对批量矩阵(M×3×3)与对应向量(M×3×1)执行高效逐片矩阵乘法,避免显式 Python 循环,显著提升计算性能。 使用 numpy 的 `np.matmul` 可对批量矩阵(m×3×3)与对应向量(m×3×1)执行高效逐片矩阵乘法,避免显式 python 循环,显著提升计算性能。 在深度学习、几何变换或批量线性系统求解等场景中,常需对一批形状为 M...
本文解析了因函数逻辑错误导致 while 循环提前终止的根本原因,并提供使用 any() 优化零值检测的正确实现方案,确保矩阵中所有零元素被彻底处理。 本文解析了因函数逻辑错误导致 while 循环提前终止的根本原因,并提供使用 `any()` 优化零值检测的正确实现方案,确保矩阵中所有零元素被彻底处理。 问题核心在于 not_solved() 函数的逻辑缺陷:它并未真正判断“矩阵中是否存在零”,...
不能直接用hashlib.md5(file.read()).hexdigest()读整个文件,因大文件会引发MemoryError;正确做法是分块读取(如8192字节)、二进制模式('rb')打开、iter(lambda: f.read(8192), b'')安全迭代,内存恒定几KB。 为什么不能直接用 hashlib.md5(file.read()).hexdigest() 读整个文件? 大文件...
本文介绍如何使用 pandas 的 pivot_table 和 categorical 配合 fill_value 参数,将原始流动数据(含 origin-destination 地理编码和流量值)高效转换为指定地理单元集合的 n×n 流量矩阵,缺失组合自动补零。 本文介绍如何使用 pandas 的 pivot_table 和 categorical 配合 fill_value 参数,将原始流动数...
Gemini Python SDK 默认请求超时时间过短,导致频繁触发 DeadlineExceeded (504) 错误;而直接使用 curl 却能快速响应,根本原因在于 SDK 的 gRPC 客户端默认 timeout 设置不合理(通常仅约 60 秒且可能受底层重试逻辑影响),需显式延长超时阈值。 gemini python sdk 默认请求超时时间过短,导致频繁触发 `deadlineexc...
本文介绍如何使用 NumPy 的 np.matmul 实现批量矩阵-向量乘法,避免显式 Python 循环,在保持语义清晰的同时显著提升计算效率。适用于深度学习、几何变换等需对 M 组 3×3 矩阵分别作用于对应 3 维向量的场景。 本文介绍如何使用 numpy 的 `np.matmul` 实现批量矩阵-向量乘法,避免显式 python 循环,在保持语义清晰的同时显著提升计算效率。适用于深度学习、...
numpy.corrcoef 默认按行计算,即 rowvar=True,每行视为一个变量、每列视为一个观测值;若数据为标准格式 (n_samples, n_features),需显式设 rowvar=False 才能得到正确的 n_features × n_features 相关系数矩阵。 corrcoef 函数默认按行还是按列计算? numpy.corrcoef 默认把**每一行当作一个变量(观...
本文介绍一种针对大型分块对角矩阵(部分对角块为零矩阵)的高效、精准求逆方法:仅对非零块单独求逆并组装,跳过奇异块,避免全局矩阵运算,时间复杂度从 $o((3n)^3)$ 降至 $o(n)$,适用于 $n \sim 10^4$ 规模。 本文介绍一种针对大型分块对角矩阵(部分对角块为零矩阵)的高效、精准求逆方法:仅对非零块单独求逆并组装,跳过奇异块,避免全局矩阵运算,时间复杂度从 $o((3n)^3)...