Подтвердить что ты не робот

Почему SciPy действует по-разному в IPython и Python?

Я написал этот тест script:

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

Edit

Я наблюдал это поведение только с единственной точностью и 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, а затем вставлял код в файл *.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
4b9b3361

Ответ 1

Может быть, что LD_LIBRARY_PATH отличается при использовании IPython. Это может привести к использованию разных библиотек. Вы можете проверить это как на Python, так и на IPython и посмотреть, идентичны ли они:

import os
print os.environ['LD_LIBRARY_PATH']