我写了这个测试脚本:
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 <module>
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行为的这种差异?相关软件版本为:
修改
我仅使用单精度和n >= 130
观察到此行为。如果n = 129
,则代码适用于Python和IPython。
在np.random.seed(1234)
之后添加import
会得到相同的结果: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
答案 0 :(得分:1)
使用IPython时, LD_LIBRARY_PATH 可能会有所不同。这可能导致使用不同的库。您可以在Python和IPython中检查它,看看它们是否相同:
import os
print os.environ['LD_LIBRARY_PATH']