RuntimeWarning: tamanho de numpy.dtype alterado, pode indicar incompatibilidade binária


148

Eu tenho esse erro ao tentar carregar um modelo SVM salvo. Tentei desinstalar o sklearn, NumPy e SciPy, reinstalando as versões mais recentes novamente (usando pip). Ainda estou recebendo esse erro. Por quê?

In [1]: import sklearn; print sklearn.__version__
0.18.1
In [3]: import numpy; print numpy.__version__
1.11.2
In [5]: import scipy; print scipy.__version__
0.18.1
In [7]: import pandas; print pandas.__version__
0.19.1

In [10]: clf = joblib.load('model/trained_model.pkl')
---------------------------------------------------------------------------
RuntimeWarning                            Traceback (most recent call last)
<ipython-input-10-5e5db1331757> in <module>()
----> 1 clf = joblib.load('sentiment_classification/model/trained_model.pkl')

/usr/local/lib/python2.7/dist-packages/sklearn/externals/joblib/numpy_pickle.pyc in load(filename, mmap_mode)
    573                     return load_compatibility(fobj)
    574
--> 575                 obj = _unpickle(fobj, filename, mmap_mode)
    576
    577     return obj

/usr/local/lib/python2.7/dist-packages/sklearn/externals/joblib/numpy_pickle.pyc in _unpickle(fobj, filename, mmap_mode)
    505     obj = None
    506     try:
--> 507         obj = unpickler.load()
    508         if unpickler.compat_mode:
    509             warnings.warn("The file '%s' has been generated with a "

/usr/lib/python2.7/pickle.pyc in load(self)
    862             while 1:
    863                 key = read(1)
--> 864                 dispatch[key](self)
    865         except _Stop, stopinst:
    866             return stopinst.value

/usr/lib/python2.7/pickle.pyc in load_global(self)
   1094         module = self.readline()[:-1]
   1095         name = self.readline()[:-1]
-> 1096         klass = self.find_class(module, name)
   1097         self.append(klass)
   1098     dispatch[GLOBAL] = load_global

/usr/lib/python2.7/pickle.pyc in find_class(self, module, name)
   1128     def find_class(self, module, name):
   1129         # Subclasses may override this
-> 1130         __import__(module)
   1131         mod = sys.modules[module]
   1132         klass = getattr(mod, name)

/usr/local/lib/python2.7/dist-packages/sklearn/svm/__init__.py in <module>()
     11 # License: BSD 3 clause (C) INRIA 2010
     12
---> 13 from .classes import SVC, NuSVC, SVR, NuSVR, OneClassSVM, LinearSVC, \
     14         LinearSVR
     15 from .bounds import l1_min_c

/usr/local/lib/python2.7/dist-packages/sklearn/svm/classes.py in <module>()
      2 import numpy as np
      3
----> 4 from .base import _fit_liblinear, BaseSVC, BaseLibSVM
      5 from ..base import BaseEstimator, RegressorMixin
      6 from ..linear_model.base import LinearClassifierMixin, SparseCoefMixin, \

/usr/local/lib/python2.7/dist-packages/sklearn/svm/base.py in <module>()
      6 from abc import ABCMeta, abstractmethod
      7
----> 8 from . import libsvm, liblinear
      9 from . import libsvm_sparse
     10 from ..base import BaseEstimator, ClassifierMixin

__init__.pxd in init sklearn.svm.libsvm (sklearn/svm/libsvm.c:10207)()

RuntimeWarning: numpy.dtype size changed, may indicate binary incompatibility. Expected 96, got 80

UPDATE: OK, seguindo aqui e

pip uninstall -y scipy scikit-learn
pip install --no-binary scipy scikit-learn

O erro foi resolvido, embora eu ainda não tenha idéia do por que ocorreu em primeiro lugar ...


3
--no-use-wheelrecompila o módulo da fonte com relação ao que você tem no seu sistema.
ivan_pozdeev

17
Nas versões mais recentes do pip, este comando foi renomeado para --no-binary.
s_kirkiles

1
Yep, isso funcionou para mim: pip install --no-binary :all: pandas. FWIW Eu estava recebendo esse erro em uma nova versão do VE sobre a versão do Python Python 3.6.6 :: Anaconda, Inc.com apenas requestse pandasinstalada no ambiente.
Safay 15/08

Deve ser fixado agora em Cython 0,29, conforme comentado a seguir
mattip

Você também precisa instalar o gfortranscipy para compilar:sudo apt install gfortran
ma3oun

Respostas:


145

De acordo com o MAINT: silencie os avisos do Cython sobre alterações de tamanho de tipo / ufunc. - numpy / numpy :

Esses avisos são visíveis sempre que você importa o scipy (ou outro pacote) que foi compilado em um numpy mais antigo do que o instalado.

e as verificações são inseridas pelo Cython (portanto, estão presentes em qualquer módulo compilado).

Para encurtar a história, esses avisos devem ser benignos no caso particular denumpy , e essas mensagens são filtradas desdenumpy 1.8 (o ramo em que este commit entrou). Enquanto scikit-learn 0.18.1é compiladonumpy 1.6.1 .

Para filtrar esses avisos , você pode fazer o mesmo que o patch :

import warnings
warnings.filterwarnings("ignore", message="numpy.dtype size changed")
warnings.filterwarnings("ignore", message="numpy.ufunc size changed")

Claro, você pode apenas recompilar todos os módulos afetados de fonte contra a sua locaisnumpy com pip install --no-binary :all:¹ vez se você tem as bolas de ferramentas para isso.


História mais longa: o proponente do patch alega que não deve haver riscos específicos numpy, e pacotes de terceiros são criados intencionalmente contra versões mais antigas:

[Reconstruir tudo contra o numpy atual] não é uma solução viável e certamente não deve ser necessária. O Scipy (como muitos outros pacotes) é compatível com várias versões do numpy. Portanto, quando distribuímos binários scipy, os compilamos na versão numpy com suporte mais baixa (1.5.1 a partir de agora) e eles funcionam com 1.6.x, 1.7.xe também com o mestre numpy.

O correto seria o Cython emitir apenas avisos quando o tamanho de dtypes / ufuncs sofrer alterações de uma maneira que interrompa a ABI e, caso contrário, fique em silêncio.

Como resultado, os desenvolvedores do Cython concordaram em confiar à equipe numpy a manutenção da compatibilidade binária manualmente , portanto, podemos esperar que o uso de versões com alterações de ABI quebradas geraria uma exceção especialmente criada ou algum outro impedimento explícito.


¹ A --no-use-wheelopção disponível anteriormente foi removida desde entãopip 10.0.0 .


1
Ligações Doc: --no-binary, substituições per-requisito para arquivos requisitos . Além disso, vim aqui pandas, então aqui está a pandasquestão relevante do GitHub .
precisa saber é

35

É a edição da nova versão numpy (1.15.0)

Você pode fazer o downgrade numpy e esse problema será corrigido:

sudo pip uninstall numpy
sudo pip install numpy==1.14.5

Finalmente, a versão numpy 1.15.1 é lançada, para que os problemas de aviso sejam corrigidos.

sudo pip install numpy == 1.15.1

Isso está funcionando ..


6
Por engano, o código que acalma esse aviso foi removido entre 1.14.5 e 1.15.0. A correção faz parte da versão 1.15.1, que deve ser lançada no final de agosto de 2018
mattip 20/08/1918

3
Obrigado @mattip. pip install numpy==1.15.1me passou de 1.15.0 para 1.15.1 e as mensagens de aviso foram embora.
keithpjolley

Com o numpy 1.15.0, recebi o relatório acima aviso msg ao importar o PyTables versão 3.4.4 e H5Py versão 2.8.0. O aviso desapareceu após a instalação do Numpy versão 1.15.1.
Sun Bear

8

se você estiver em um ambiente anaconda, use:

conda update --all

2
Ou atualizar apenas numpy que funcionou para mim:conda update numpy
Dan rei

8

Eu tentei as maneiras acima mencionadas, mas nada funcionou. Mas o problema desapareceu depois que eu instalei as bibliotecas através da instalação apt,

Para Python3,

pip3 uninstall -y numpy scipy pandas scikit-learn
sudo apt update
sudo apt install python3-numpy python3-scipy python3-pandas python3-sklearn 

Para Python2,

pip uninstall -y numpy scipy pandas scikit-learn
sudo apt update
sudo apt install python-numpy python-scipy python-pandas python-sklearn 

Espero que ajude.


11
você desinstalou as versões do Py2 e instalou as do Py3.
percusse

Parece que a instalação de versões python3 também resolveu meu problema.
Menu9 Ishan

Se você instalar pacotes binários, inclusive numpydo repositório da distribuição oficial, e não do PyPI, é claro que todos serão compilados com o mesmo numpy. A desvantagem é que você pode não estar recebendo as versões mais recentes.
ivan_pozdeev

7

Basta atualizar seu módulo numpy, agora é 1.15.4. Para Windows

pip install numpy --upgrade

1

Este erro ocorre porque os pacotes instalados foram criados novamente com uma versão diferente do numpy.
Precisamos reconstruir scipy e scikit-learn contra o local numpy.

Para novos pip(no meu caso pip 18.0) isso funcionou:

pip uninstall -y scipy scikit-learn
pip install --no-binary scipy,scikit-learn -I scipy scikit-learn

--no-binaryleva uma lista de nomes de pacotes para os quais você deseja ignorar os binários. Nesse caso, passamos o --no-binary scipy,scikit-learnque ignorará os binários dos pacotes scipy, scikit-learn. Não me ajudou


0

Meta-informações: a maneira recomendada de instalar o sklearn

Se você já possui uma instalação funcional de numpy e scipy, a maneira mais fácil de instalar o scikit-learn é usando pip

pip install -U scikit-learn 

ou conda:

conda install scikit-learn

[... não compilar a partir da fonte usando pip]

Se você ainda não possui uma instalação python com numpy e scipy, recomendamos a instalação pelo gerenciador de pacotes ou por um pacote python . Eles vêm com numerpy, scipy, scikit-learn, matplotlib e muitas outras bibliotecas científicas e de processamento de dados úteis.



-3

Meu ambiente é Python 2.7.15

eu tento

pip uninstall
pip install --no-use-wheel

mas não funciona. Mostra o erro:

não existe essa opção: --sem roda de uso

Então eu tento:

pip uninstall
pip install --user --install-option="--prefix=" -U scikit-learn

E funciona: os avisos inúteis não aparecem.


3
A opção --no-use-wheelfoi removida. Use em --no-binary :all:vez disso.
Jlarson #

-5

Ao importar scipy, as informações de erro mostram: RuntimeWarning: builtin .type tamanho alterado, pode indicar incompatibilidade binária. Zd esperado, obteve zd

Resolvi esse problema atualizando a versão python de 2.7.2 para 2.7.13

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.