ValueError: numpy.dtype имеет неправильный размер, попробуйте перекомпилировать

86

Я только что установил пакет pandas и statsmodels на свой python 2.7. Когда я попробовал «импортировать pandas как pd», появляется это сообщение об ошибке. Кто-нибудь может помочь? Благодарность!!!

numpy.dtype has the wrong size, try recompiling
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\analytics\ext\python27\lib\site-packages\statsmodels-0.5.0-py2.7-win32.egg\statsmodels\formula\__init__.py",
line 4, in <module>
    from formulatools import handle_formula_data
  File "C:\analytics\ext\python27\lib\site-packages\statsmodels-0.5.0-py2.7-win32.egg\statsmodels\formula\formulatools.p
y", line 1, in <module>
    import statsmodels.tools.data as data_util
  File "C:\analytics\ext\python27\lib\site-packages\statsmodels-0.5.0-py2.7-win32.egg\statsmodels\tools\__init__.py", li
ne 1, in <module>
    from tools import add_constant, categorical
  File "C:\analytics\ext\python27\lib\site-packages\statsmodels-0.5.0-py2.7-win32.egg\statsmodels\tools\tools.py", line
14, in <module>
    from pandas import DataFrame
  File "C:\analytics\ext\python27\lib\site-packages\pandas\__init__.py", line 6, in <module>
    from . import hashtable, tslib, lib
  File "numpy.pxd", line 157, in init pandas.tslib (pandas\tslib.c:49133)
ValueError: numpy.dtype has the wrong size, try recompiling
Эмбер Чен
источник
1
Как вы установили панды?
Энди Хайден
1
возможный дубликат Cannot import Scikit-Learn
Bakuriu
Перекомпилировать пробовали?
asmeurer
Почему бы не использовать распределение python (x, y), enthought или winpython? Они специально разработаны для устранения этих проблем с компиляцией и установкой для научных пользователей Python под Windows и поставляются с большинством пакетов, которые вы, вероятно, захотите предварительно скомпилировать.
DaveP
39
Это сообщение появляется, когда pandas компилируется с более новой версией numpy, чем та, которую вы установили. Вам нужно либо перекомпилировать pandas для версии numpy, которую вы установили, либо обновить numpy.
Josef

Ответы:

65

(чтобы немного расширить мой комментарий)

Разработчики Numpy в целом придерживаются политики сохранения обратно совместимого двоичного интерфейса (ABI). Однако ABI не поддерживает прямую совместимость.

Что это значит:

Пакет, который использует numpy в скомпилированном расширении, компилируется для конкретной версии numpy. Будущая версия numpy будет совместима с скомпилированным расширением пакета (см. Исключения ниже). Распространителям этих других пакетов не нужно перекомпилировать свой пакет для более новых версий numpy, и пользователям не нужно обновлять эти другие пакеты, когда пользователи обновляются до более новой версии numpy.

Однако в обратном направлении дело не идет. Если пакет скомпилирован для конкретной версии numpy, скажем 1.7, тогда нет гарантии, что двоичные файлы этого пакета будут работать со старыми версиями numpy, скажем 1.6, и очень часто или большую часть времени они не будут.

Бинарное распространение пакетов, таких как pandas и statsmodels, которые скомпилированы с использованием последней версии numpy, не будет работать, если установлена ​​более старая версия numpy. Некоторые пакеты, например matplotlib, если я правильно помню, компилируют свои расширения против самой старой версии numpy, которую они поддерживают. В этом случае пользователи с той же старой или любой более новой версией numpy могут использовать эти двоичные файлы.

Сообщение об ошибке в вопросе является типичным результатом двоичной несовместимости.

Решение состоит в том, чтобы получить версию, совместимую с двоичным кодом, либо обновив numpy, по крайней мере, до версии, против которой были скомпилированы pandas или statsmodels, либо перекомпилируя pandas и statsmodels для более старой версии numpy, которая уже установлена.

Нарушение обратной совместимости ABI:

Иногда улучшения или рефакторинг в numpy нарушают обратную совместимость ABI. Это произошло (непреднамеренно) с numpy 1.4.0. Как следствие, пользователи, обновившие numpy до 1.4.0, имели двоичную несовместимость со всеми другими скомпилированными пакетами, которые были скомпилированы против предыдущей версии numpy. Это требует, чтобы все пакеты с двоичными расширениями, которые используют numpy, были перекомпилированы для работы с версией, несовместимой с ABI.

Йозеф
источник
1
Я пробовал обновить numpy и pandas, но все еще получаю эту ошибку. Есть идеи?
NotSoShabby
37

Для меня (Mac OS X Maverics, Python 2.7)

easy_install --upgrade numpy

помогло. После этого вы можете установить обновленные пакеты pandas , scikit-learn и т. Д. С помощью pip :

pip install pandas
Федор Червинский
источник
3
Я только что выполнил "easy_install --upgrade numpy", но не установил актуальные связанные пакеты, такие как pandas andk scikit-learn. Тоже все ок.
xjzhou
У меня тоже работал (Ubuntu 14.04, Python 2.7)
Генри Чиннер
30

Я обнаружил, что это простая версия, устаревшая или несоответствующая, и была исправлена ​​с помощью:

pip install --upgrade numpy
pip install --upgrade scipy
pip install --upgrade pandas

Или может работать с одним лайнером:

pip install --upgrade numpy scipy pandas
RexFuzzle
источник
При изменениях el capitan в OSX я рекомендую использовать --user в качестве дополнительного аргумента, чтобы предотвратить перезапись системных файлов pip. В противном случае у пользователей возникнет соблазн использовать sudo.
Рой Якоб
@ Roy - Это зависит от того, используется ли системный питон или версия brew afaik- sudo не требуется с brew python.
RexFuzzle 01
5

У меня была аналогичная ошибка с другой библиотекой, и я понял, что в моей системе установлено несколько версий numpy. Исправление для меня заключалось в том, чтобы отредактировать мой PYTHONPATH и поместить пакеты сайтов, содержащие последнюю версию numpy, в первую позицию.

Калимо
источник
1

Я также сталкиваюсь с этой ошибкой при использовании pandas для доступа к MYSQL. Это сообщение об ошибке указывает на проблему двоичной совместимости и может быть решено с помощью последней версии pandas и пакета numpy. Вот мои шаги по решению этой проблемы, и они хорошо работают на моем Ubuntu 12.04:

cd /tmp/
wget https://pypi.python.org/packages/source/p/pandas/pandas-0.12.0.tar.gz
tar xzvf pandas-0.12.0.tar.gz
cd pandas-0.12.0
easy_install --upgrade numpy
Houcheng
источник
1
Я сделал это и получил эту ошибкуFile "numpy/core/setup.py", line 654, in get_mathlib_info RuntimeError: Broken toolchain: cannot link a simple C program
Мона Джалал
1

В моем случае я установил pandas-0.10.0.win-amd64-py2.7, но проверял, исправлена ​​ли ошибка в более поздней версии pandas. Итак, я сделал easy_install -U, чтобы принудительно выполнить обновление, но затем получил указанную выше ошибку из-за некоторых несовместимостей с numpy и т. Д., Когда я сделал

import pandas

Чтобы исправить это, я просто переустановил двоичный файл pandas-0.10.0.win-amd64-py2.7, и все работает. Я не видел этого ответа (предлагает использовать pip), который, возможно, помог мне (хотя и не уверен). Установите конкретную версию с помощью easy_install

Также это подчеркивает, почему следует использовать virtualenv (чего я не делал).

Павел
источник
1

Для меня (Mac OS X Mavericks) удалось установить версию для python2.6:

sudo port install py26-scikit-learn

затем запустите:

python2.6 myscript.py
user3915137
источник
1

Проблема, которую я решил в Webfaction, заключалась в старой библиотеке numpy (1.5), которая конфликтовала с моими свежими

pip install pandas

установка в .virtualenv.

Проблема была решена после того, как я установил pandas из виртуальной среды. Идея пришла из обсуждения на https://github.com/pydata/pandas/issues/3711 , спасибо, cpcloud !

ph7
источник
0

Я просто столкнулся с этой проблемой ValueError и решил ее. Определенно что-то не так с пакетом numpy.

Но когда я пытаюсь pip install --upgrade numpyэто сделать, это не удается, поэтому я удаляю и загружаю самый новый numpy.zipфайл. Затем вручную разархивируйте и python setup.py installэто.

К счастью, это работает!

Юхао
источник
У меня тоже не получилось. Потом я попробовал, sudo pip install --upgrade numpyи это сработало.
Harsh Wardhan
0

Как сказал @ user333700, требуемые версии библиотек могут не соответствовать друг другу. Вы получаете одну библиотеку как зависимость от другой. Затем, не зная, что она уже установлена ​​как зависимость, вам понадобится эта конкретная библиотека, и вы установите одну версию. В таких случаях зависимости могут испортиться.

Я пережил такой случай и искал решение. Нашел это: https://stackoverflow.com/a/12975518/1694344

У меня было две разные версии для файла с информацией о яйцах и имени папки numpy:

drwxr-xr-x. 19 root root   4096 Sep 25 15:00 numpy
drwxr-xr-x.  2 root root   4096 Sep 22 11:25 numpy-1.13.1.dist-info
-rw-r--r--.  1 root root   1630 Nov 20  2015 numpy-1.7.1-py2.7.egg-info

Я удалил их все и переустановил numpy с помощью pip.

Седат Кестепе
источник
0

У меня была аналогичная проблема, и простая повторная установка с использованием, pip install ...как предлагалось в предыдущих комментариях, не сработала.

Что сработало для меня, так это переустановка с добавленным флагом pip install --no-cache-dir ..., похоже, где-то в кеше была несовместимая версия numpy.

Йоси Вайнштейн
источник
-1

Бывают случаи, когда вы хотите сохранить определенную версию NumPy, и упомянутый здесь вариант обновления не работает. Примером, который пришел мне в голову, был дистрибутив Python, предустановленный вместе с ArcGIS. Чтобы ArcPy работал в ArcGIS 10.5.1, этот дистрибутив должен быть Python 2.7.12 с NumPy 1.9.3, и любая другая версия NumPy, вероятно, вызовет проблемы с вашей функциональностью ArcPy.

Что вы можете сделать в этом случае, так это попытаться установить конкретную старую версию проблемной сторонней библиотеки, которая должна быть совместима со старой версией NumPy, которая есть в ArcGIS.

Например, scikit-learn 0.19.1 НЕ будет работать с NumPy 1.9.3 и приведет к той же ошибке, которую вы упомянули. Однако scikit-learn 0.15 работает нормально. Вы можете протестировать разные версии, чтобы найти ту, которая работает. Просто укажите номер версии через pip:

python -m pip install scikit-learn==0.15
dbouz
источник