在我的代码中,我需要计算矩阵的伪逆,并且可能发生矩阵的某些元素是无穷大的(np.inf
)。有时候pinv()
函数可以很好地处理它并返回一些东西,但有时它会挂起100%的CPU使用率,我需要终止进程。见下面的演示:
Python 3.4.3+ (default, Oct 14 2015, 16:03:50)
Type "copyright", "credits" or "license" for more information.
IPython 4.1.2 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: import numpy as np
In [2]: import numpy.linalg as la
In [3]: x = np.array([[550.0, 1], [1, np.inf]])
In [4]: la.pinv(x)
Out[4]:
array([[ 0., 0.],
[ 0., 0.]])
In [5]: x = np.array([[np.inf, np.inf], [np.inf, np.inf]])
In [6]: la.pinv(x)
Out[6]:
array([[ nan, nan],
[ nan, nan]])
In [7]: x = np.array([[550.0, 1], [np.inf, np.inf]])
In [8]: la.pinv(x) # here it just hung and I had to kill it from outside
Killed
为什么会这样?为什么它适用于inf
的某些安排,但它只是挂在其他?这可能是一个错误(即应该先检查值)?
答案 0 :(得分:1)
我在numpy的GitHub存储库上打开了issue。
答案是它是BLAS / LAPACK / ATLAS中的一个错误,而numpy(1.10.4)函数只是那些来自那些不会事先检查输入的程序的薄包装,因为它会损害性能。< / p>