Python 3.8矩阵求-1次幂时零位置生成inf如何直接返回0
问题描述
在Python中定义如下对角矩阵:
[[1134.01 0. ] [ 0. 1134.01]]
使用mat**-1、pow(mat, -1)两种写法对矩阵求-1次幂时,原矩阵0值位置会返回inf,得到结果如下:
[[0.00088183 inf] [ inf 0.00088183]]
运行时触发除零警告:
RuntimeWarning: divide by zero encountered in reciprocal
需要排除「手动将结果中inf替换为0」「给原始矩阵添加极小值」两种方案,找到计算时不生成inf、直接在0对应位置返回0的实现方法。
解决方案
首先要明确核心问题:对numpy数组使用**-1或原生pow是逐元素取倒数操作,并非线性代数定义的矩阵求逆,0元素会直接执行1/0运算,自然会生成inf。根据你的实际需求选对应方法即可,两种方法都不会产生inf,也不需要事后修正值:
- 如果你的需求是逐元素求倒数,原矩阵0值对应结果为0
用np.where做条件分支计算,仅对非零元素执行倒数运算,从根源避免除零操作:
运行不会触发除零警告,0值位置直接返回0,非零值正常计算倒数。import numpy as np mat = np.array([[1134.01, 0.], [0., 1134.01]]) res = np.where(mat == 0, 0, 1 / mat) - 如果你的需求是计算线性代数意义上的矩阵逆
不要用逐元素运算的写法,直接调用numpy线性代数模块的求逆接口即可。对角矩阵的逆矩阵非对角元本身就是0,计算过程不会出现除零问题:
计算得到的结果为import numpy as np mat = np.array([[1134.01, 0.], [0., 1134.01]]) res = np.linalg.inv(mat)[[0.00088183, 0.], [0., 0.00088183]],完全符合矩阵逆的数学定义,无inf值。
内容的提问来源于stack exchange,提问作者confused
相关产品推荐
相关产品推荐

