我写了这个测试脚本:
import numpy as np
import scipy.linalg
n = 130
r = np.array(np.random.normal(size=(n, n)), dtype=np.float32)
e = scipy.linalg.eig(r, left=False, right=False)
print e.mean()
使用IPython运行它,代码总是在几秒钟内成功(我尝试了大约十几次)
使用Python,代码总是无法收敛(或只是挂起,对于一些较大的n)与一个消息,如
Traceback (most recent call last):
File "strange.py", line 6, in
e = scipy.linalg.eig(r, left=False, right=False)
File "/usr/lib/python2.7/dist-packages/scipy/linalg/decomp.py", line 179, in eig
"with order >= %d have converged)" % info)
numpy.linalg.linalg.LinAlgError: eig algorithm did not converge (only eigenvalues with order >= 130 have converged)
什么解释了Python和IPython行为的差异?相关软件版本有:
> Ubuntu 12.04,64位
> Numpy 1.6.1
> SciPy 0.9.0
> Python 2.7.3
IPython 0.12.1
编辑
我仅用单精度观察到这种行为,n> = 130.如果n = 129,则代码可以在Python和IPython中工作.
在导入后添加np.random.seed(1234)提供相同的结果:IPython收敛,而Python不会.
scipy.linalg .__ file__ =’/usr/lib/python2.7/dist-packages/scipy/linalg/__init__.pyc’.尽管如此,我猜猜IPython和Python以某种方式设法拉入不同的LAPACK版本,但是如何呢?
我注意到这个奇怪的方式是我在尝试IPython,然后将代码粘贴到我用Python运行的* .py文件中.你可以想象一下我有多困惑.
编辑2.
在Python和IPython中,np.geterr()是{‘divide’:’warn’,’invalid’:’warn’,’over’:’warn’,’under’:’ignore’}
$ls -l /etc/alternatives/libblas.so
lrwxrwxrwx 1 root root 37 Jun 29 18:21 /etc/alternatives/libblas.so -> /usr/lib/openblas-base/libopenblas.so