我写了这个测试脚本:
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 的这种行为差异?相关软件版本为:
- 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 中都有效。
在 import
之后添加 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。
np.geterr()
是 {'divide': 'warn', 'invalid': 'warn', 'over': 'warn', 'under': 'ignore '}
在 Python 和 IPython 中
$ 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
最佳答案
当您使用 IPython 时,LD_LIBRARY_PATH 可能不同。这可能会导致使用不同的库。您可以在 Python 和 IPython 中检查这一点,看看它们是否相同:
import os
print os.environ['LD_LIBRARY_PATH']
关于python - 为什么 SciPy 在 IPython 和 Python 中的行为截然不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20495026/