提问人:MWB 提问时间:12/10/2013 最后编辑:MWB 更新时间:1/2/2014 访问量:669
为什么 SciPy 在 IPython 和 Python 中的行为非常不同?
Why is SciPy acting very differently in IPython and Python?
问:
我写了这个测试脚本:
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 >= 130
n = 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
答:
可能是使用 IPython 时LD_LIBRARY_PATH有所不同。这可能会导致使用不同的库。您可以在 Python 和 IPython 中检查这一点,看看它们是否相同:
import os
print os.environ['LD_LIBRARY_PATH']
上一个:(切斯)方案基准?
评论
np.seed(1234)
https://gist.github.com/tsbertalan/8173209
libopenblas-base