为什么SciPy在IPython和Python中的表现截然不同?

Max*_*axB 12 python ubuntu numpy ipython scipy

我写了这个测试脚本:

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()
Run Code Online (Sandbox Code Playgroud)

使用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)
Run Code Online (Sandbox Code Playgroud)

是什么解释了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)imports 之后添加给出相同的结果:IPython收敛,而Python则不收敛.

scipy.linalg.__file__ = '/usr/lib/python2.7/dist-packages/scipy/linalg/__init__.pyc'同时.尽管如此,我猜想IPython和Python会以某种方式设法引入不同的LAPACK版本,但是如何?

我注意到这种奇怪的方式是我正在试验IPython,然后将代码粘贴到*.py我用Python运行的文件中.你可以想象我有多困惑.

编辑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
Run Code Online (Sandbox Code Playgroud)

SKV*_*SKV 1

当您使用 IPython 时,LD_LIBRARY_PATH可能会有所不同。这可能会导致使用不同的库。您可以在 Python 和 IPython 中检查这一点,看看它们是否相同:

import os
print os.environ['LD_LIBRARY_PATH']
Run Code Online (Sandbox Code Playgroud)