Я написал этот тест 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