python - 为什么 SciPy 在 IPython 和 Python 中的行为截然不同?

标签 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 中都有效。

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/

相关文章:

python - 从抽象方法继承包装器

java - 生成 Checkmarx 报告时 Jenkins 作业为 "OutOfMemoryError: Java heap space"

python - 如何将异构数据 (np.genfromtxt) 作为二维数组加载?

python - 在 Python 中实现凯撒密码算法

python - 从 Gtk.Widget 派生更好还是直接从特定小部件派生更好?

python - Python 中**kwargs 的正确使用方法

ubuntu - 未加载 Xdebug 扩展。使用 Xampp 在 Ubuntu 上不会生成代码覆盖率

python - python脚本中的wkhtmltopdf不适用于cronjob

python - 如何在 Windows Server 2012 上使用 "OverflowError: Python int too large to convert to C long"错误进行转换?

python - 检测训练集的频率