Dr.*_*rew 23 python numpy linear-algebra
在这里研究一些矩阵代数.有时我需要反转可能是单数或病态的矩阵.我知道简单地执行此操作是pythonic:
try:
i = linalg.inv(x)
except LinAlgErr as err:
#handle it
Run Code Online (Sandbox Code Playgroud)
但我不确定它的效率如何.这会不会更好?
if linalg.cond(x) < 1/sys.float_info.epsilon:
i = linalg.inv(x)
else:
#handle it
Run Code Online (Sandbox Code Playgroud)
numpy.linalg只是简单地执行我禁止的测试吗?
Dr.*_*rew 12
所以基于这里的输入,我用显式测试作为解决方案标记我的原始代码块:
if linalg.cond(x) < 1/sys.float_info.epsilon:
i = linalg.inv(x)
else:
#handle it
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,numpy.linalg.inv函数不执行此测试.我检查了代码,发现它经历了所有的阴谋,然后只是调用lapack例程 - 看起来非常低效.此外,我还要提到DaveP提出的观点:除非明确需要,否则不应计算矩阵的逆矩阵.
您应该计算矩阵的条件数以查看它是否可逆。
import numpy.linalg
if numpy.isfinite(numpy.linalg.cond(A)):
B = numpy.linalg.inv(A)
else:
# handle it
Run Code Online (Sandbox Code Playgroud)