RuntimeWarning:numpy.dtype大小已更改,可能表明二进制不兼容


148

我尝试加载已保存的SVM模型时遇到此错误。我尝试卸载sklearn,NumPy和SciPy,然后再次重新安装最新版本(使用pip)。我仍然收到此错误。为什么?

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

更新:确定,请按照此处

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

该错误现在已经消失了,尽管我仍然不知道为什么会首先发生它。


3
--no-use-wheel根据系统上的任何内容从源重新编译模块。
ivan_pozdeev

17
在较新版本的pip中,此命令已重命名为--no-binary
s_kirkiles

1
是的,这个工作对我来说:pip install --no-binary :all: pandas。FWIW我得到一个新的这个错误VE对Python版本顶部构建Python 3.6.6 :: Anaconda, Inc.,只有requestspandas安装环境。
safay

现在应该在cython 0.29中修复,如下所述
mattip

您还需要安装gfortranscipy才能编译:sudo apt install gfortran
ma3oun

Answers:


145

根据MAINT:沉默有关更改dtype / ufunc大小的Cython警告。-numpy / numpy

每当您导入针对比已安装的numpy早的numpy编译的scipy(或其他软件包)时,这些警告都是可见的。

支票由Cython插入(因此,在任何使用它编译的模块中都存在)。

长话短说,这些警告在的特定情况下应该是良性的numpy,并且numpy 1.8(此提交进入的分支)开始这些消息就会被过滤掉。虽然scikit-learn 0.18.1针对编译numpy 1.6.1

要自己过滤这些警告,您可以执行与补丁程序相同的操作

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

当然,你可以重新编译从源代码的所有受影响的模块对当地numpypip install --no-binary :all:¹ ,而不是如果你有该工具。


更长的故事:补丁程序的支持者声称专门针对numpy,应该没有任何风险,并且第3方软件包是有意针对较早版本构建的:

[针对当前的numpy重建所有内容]不是可行的解决方案,当然也没有必要。Scipy(与许多其他软件包一样)与numpy的许多版本兼容。因此,当我们分发scipy二进制文件时,我们将根据支持的最低numpy版本(截至目前为1.5.1)构建它们,并且它们也可与1.6.x,1.7.x和numpy master一起使用。

真正的正确之处在于,Cython仅在dtypes / ufuncs的大小发生变化而导致破坏ABI时发出警告,否则保持沉默。

结果,Cython的开发人员同意信任numpy团队手工维护二进制兼容性,因此我们可以期望使用具有破坏性的ABI更改的版本会产生特制的异常或某些其他显式的阻止程序。


¹ 自以来,先前可用的--no-use-wheel选项已被删除。pip 10.0.0


1
Doc链接:--no-binary按需求覆盖需求文件。另外,我是来这里的pandas,所以这里是相关的pandasGitHub问题
eacousineau

35

这是新的numpy版本(1.15.0)的问题

您可以降级numpy,此问题将得到解决:

sudo pip uninstall numpy
sudo pip install numpy==1.14.5

最终发布了numpy 1.15.1版本,从而解决了警告问题。

须藤点安装numpy == 1.15.1

这正在工作..


6
错误地使警告静默的代码在1.14.5和1.15.0之间被删除。该修复程序是1.15.1错误修正版本的一部分,该修正版本应于2018
mattip

3
谢谢@mattip。pip install numpy==1.15.1从1.15.0升级到1.15.1,警告消息消失了。
keithpjolley

使用numpy 1.15.0时,在导入PyTables版本3.4.4和H5Py版本2.8.0时收到上述报告警告msg。安装Numpy版本1.15.1后,警告消失。
太阳熊

8

如果您在anaconda环境中,请使用:

conda update --all

2
或仅更新对我有用的Numpy:conda update numpy
Dan King

8

我已经尝试了上述方法,但是没有任何效果。但是在我通过apt install安装库之后,问题就消失了,

对于Python3,

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

对于Python2,

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

希望有帮助。


11
您卸载了Py2版本并安装了Py3版本。
percusse

似乎安装python3版本也解决了我的问题。
Menuka Ishan

如果您numpy从官方发行版的存储库(而不是从PyPI)安装二进制软件包(包括),那么它们当然都是针对同一软件包编译的numpy。缺点是您可能没有获得最新版本。
ivan_pozdeev

7

只需升级您的numpy模块,现在它是1.15.4。对于窗户

pip install numpy --upgrade

1

发生此错误是因为已安装的软件包是numpy的另一个版本。
我们需要针对本地重建scipy和scikit-learnnumpy

对于新的pip(在我的情况下pip 18.0),它起作用:

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

--no-binary列出您要忽略二进制文件的软件包的名称列表。在这种情况下,我们通过--no-binary scipy,scikit-learn了它将忽略软件包scipy,scikit-learn的二进制文件。没帮我


0

元信息:安装sklearn的推荐方法

如果您已经可以正常安装numpy和scipy,则安装scikit-learn的最简单方法是使用 pip

pip install -U scikit-learn 

conda

conda install scikit-learn

[...不要使用pip从源代码编译]

如果您还没有一个Python安装与numpy的和SciPy的,我们建议通过你的包管理器,或通过任何安装一个 python的 。这些带有numpy,scipy,scikit-learn,matplotlib和许多其他有用的科学和数据处理库。


0

请注意,从cython 0.29开始,有一个新的check_size选项可以消除源代码中的警告,因此,一旦该版本渗入到各种软件包中,则无需任何解决方法


-3

我的环境是Python 2.7.15

我尝试

pip uninstall
pip install --no-use-wheel

但它不起作用。它显示错误:

没有这样的选择:--no-use-wheel

然后我尝试:

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

而且有效:不会显示无用的警告。


3
该选项--no-use-wheel已被删除。使用--no-binary :all:代替。
jmlarson '18年

-5

导入scipy时,错误信息显示:RuntimeWarning:内置 .type大小已更改,可能表示二进制不兼容。预期的zd,得到了zd

我通过将python版本从2.7.2更新到2.7.13解决了这个问题

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.