为什么 SciPy 在 IPython 和 Python 中的行为非常不同?

Why is SciPy acting very differently in IPython and Python?

提问人:MWB 提问时间:12/10/2013 最后编辑:MWB 更新时间:1/2/2014 访问量:669

问:

我写了这个测试脚本:

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
  • 科学 0.9.0
  • 蟒蛇 2.7.3
  • IPython 0.12.1

编辑

我只用单精度和 .如果 ,则代码在 Python 和 IPython 中均有效。n >= 130n = 129

在 s 之后添加会得到相同的结果:IPython 收敛,而 Python 不会收敛。np.random.seed(1234)import

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

我注意到这种奇怪现象的方式是,我正在 IPython 中进行实验,然后将代码粘贴到我使用 Python 运行的文件中。你可以想象我有一段时间是多么的困惑。*.py

编辑 2.

np.geterr()在 Python 和 IPython 中{'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
蟒蛇 ubuntu numpy scipy ipython

评论

4赞 alko 12/10/2013
顺便问一下,为什么numpy和scipy这么过时?
3赞 ev-br 12/10/2013
您没有为随机数生成器 () 设定种子。np.seed(1234)
2赞 Warren Weckesser 12/10/2013
@alko:这些是 Ubuntu 12.04 存储库中的版本。
2赞 MWB 12/11/2013
@Dougal我屈服于同行的压力升级 iPython、NumPy 和 SciPy,所以我擦除了它们,并从源代码而不是 Ubuntu 12.04 安装了最新版本。我似乎不再有这个问题了。感谢大家的帮助!
2赞 tsbertalan 12/30/2013
我制作了一台虚拟的 Ubuntu 12.04 64 位机器并安装了引用的 Numpy、SciPy、Python 和 IPython 版本,这两个版本的脚本都可以在 ipython 和 python 中使用(请参阅)。但是,安装后,如前所述,只有 ipython 可以工作。https://gist.github.com/tsbertalan/8173209libopenblas-base

答:

1赞 SKV 1/2/2014 #1

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

import os
print os.environ['LD_LIBRARY_PATH']