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

时间:2013-12-10 12:48:30

标签: python ubuntu numpy scipy ipython

我写了这个测试脚本:

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。

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

1 个答案:

答案 0 :(得分:1)

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

import os
print os.environ['LD_LIBRARY_PATH']