NumPy pinv 对整数矩阵报 not inexact:rtol=None 的阈值类型
整数矩阵调用pinv(rtol=None)时,默认阈值路径可能把整数dtype交给finfo,触发not inexact。2.5.4仍有该实现;明确浮点计算类型可保留尺寸相关阈值语义。
整数矩阵本身合法,np.linalg.pinv(a) 可以继续计算,显式写成 np.linalg.pinv(a, rtol=None) 却报 ValueError: data type ... not inexact。先检查相对截断阈值的计算路径,不要因此认定这份矩阵必须可逆或必须先手算行列式。
NumPy 2.5.4 在 rtol=None 分支中,会用输入数组 dtype 查询 finfo(...).eps。整数类型没有浮点机器精度,异常便在奇异值分解之前发生。这与伪逆计算是否遇到奇异矩阵是两回事。
显式 None 与省略参数不是同一个默认值
import numpy as np
matrix = np.array([[1, 2], [3, 4]], dtype=np.int32)
result = np.linalg.pinv(matrix, rtol=None)
rtol=None 表达按矩阵尺寸与工作浮点精度选择阈值。省略该参数时,当前实现走另一个默认值 1e-15。因此,简单删掉 rtol=None 虽可能避开异常,却改变了小奇异值截断规则,不能不加判断就当作等价处理。
rtol 与 rcond 也不能同时设置。将两者都写上以“兼容更多版本”,会触发另一个参数冲突。
按计算要求先转换为浮点
如果输入确实是整数矩阵,应用决定使用 float64 计算,并且数值范围和精度适合该类型,可以显式转换后继续保留 rtol=None:
working = matrix.astype(np.float64)
result = np.linalg.pinv(working, rtol=None)
这段接续前面的矩阵,阈值依据也随工作类型明确下来。大于 2**53 的整数不一定能在 float64 中精确保留;需要准确表示大整数或其他高精度要求时,应先评估数值方案,不能仅为绕过异常悄悄降精度。
这个转换方案针对整数输入,不应用来处理本来含复数的矩阵,否则转成实数会丢掉虚部。低精度浮点、批量矩阵或 hermitian=True 也有各自的前提,不能只看接口不再报错就认为算法选择正确。
不要直接修改 NumPy 安装目录里的 finfo 或捕获异常后返回单位矩阵。伪逆不是“失败就使用普通逆”,也不是任意矩阵都存在满足要求的整数结果。
以实际矩阵的尺度验收伪逆
验收保留矩阵形状、工作 dtype 与阈值配置,检查结果有限,并按任务容差比较 A @ A_plus @ A 与 A 等伪逆关系。近似比较需要结合矩阵尺度和条件数,不能要求浮点结果逐位相等。
还应覆盖满秩、秩亏和接近截断边界的矩阵。后续采用正式修正版时,继续用同一输入核对秩判断和残差;避免因默认阈值改变而把数值差异误认为错误已经完全恢复。


