numpy.linalg.pinv()挂起一些无限值(但不是其他人)

时间:2016-03-25 15:55:39

标签: python numpy linear-algebra

在我的代码中,我需要计算矩阵的伪逆,并且可能发生矩阵的某些元素是无穷大的(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的某些安排,但它只是挂在其他?这可能是一个错误(即应该先检查值)?

1 个答案:

答案 0 :(得分:1)

我在numpy的GitHub存储库上打开了issue

答案是它是BLAS / LAPACK / ATLAS中的一个错误,而numpy(1.10.4)函数只是那些来自那些不会事先检查输入的程序的薄包装,因为它会损害性能。< / p>