【问题标题】:ValueError: numpy.ndarray size changed, may indicate binary incompatibility. Expected 88 from C header, got 80 from PyObjectValueError:numpy.ndarray 大小已更改,可能表示二进制不兼容。预期来自 C 标头的 88,从 PyObject 获得 80
【发布时间】:2021-05-09 15:08:12
【问题描述】:

从 pyxdameraulevenshtein 导入会出现以下错误,我有

pyxdameraulevenshtein==1.5.3, 
pandas==1.1.4 and 
scikit-learn==0.20.2. 
Numpy is 1.16.1. 
Works well in Python3.6, Issue in Python3.7.

有没有人遇到过 Python3.7 (3.7.9)、docker image - python:3.7-buster 的类似问题

__init__.pxd:242: in init pyxdameraulevenshtein
    ???
E   ValueError: numpy.ndarray size changed, may indicate binary incompatibility. Expected 88 from C header, got 80 from PyObject

【问题讨论】:

    标签: python pandas numpy scikit-learn python-3.7


    【解决方案1】:

    我使用的是 Python 3.8.5。这听起来太简单了,但我也遇到了同样的问题,我所做的就是重新安装 numpy。走了。

    pip install --upgrade numpy
    

    pip uninstall numpy
    pip install numpy
    

    【讨论】:

    • 哈哈哈......我不敢相信这对我也有用!有关更多信息,我也在 Python 3.8.5 中。看起来我最初有numpy-1.19.5,然后在卸载安装步骤之后我得到了numpy-1.20.1
    • 我必须执行 pip install --upgrade numpy 才能升级。
    • Classic 将其拔下并重新插入解决方案。工作频率超出您的想象。
    • 这里相同 - 卸载和安装对我有用(根本原因可能是 AWS 上的 Anaconda env 使用 numpy 版本 1.18.5)
    • 如果你使用的是 conda 而不是 pip 呢?
    【解决方案2】:

    尝试使用numpy==1.20.0 这在这里有效,即使其他情况不同(alpine 3.12 上的 python3.8)。

    【讨论】:

    • numpy==1.20.1 已经修复了错误:-)
    • 遇到了同样的问题,通过将 numpy 升级到 1.20.3 解决了
    • numpy==1.20.3修复
    【解决方案3】:

    确实,使用numpy>=1.20.0 进行(构建和)安装应该可以工作,正如所指出的那样,例如通过这个answer below。不过,我认为一些背景可能会很有趣——并且还提供了替代解决方案。

    numpy 1.20.0 中有一个 change in the C API。在某些情况下,pip 似乎为构建阶段下载了最新版本的numpy,但随后程序以安装版本的numpy 运行。如果在<1.20中使用的build版本,但是安装的版本是=>1.20,这会导致错误。

    (由于向后兼容性,其他方式应该无关紧要。但如果使用已安装的版本numpy<1.20,他们并没有预料到即将发生的变化。)

    这导致解决问题的几种可能方法:

    • 升级(构建版本)到numpy>=1.20.0
    • pyproject.toml (oldest-supported-numpy) 中使用最小支持的numpy版本
    • 安装--no-binary
    • 安装--no-build-isolation

    有关潜在解决方案的更详细讨论,请参阅 https://github.com/scikit-learn-contrib/hdbscan/issues/457#issuecomment-773671043.

    【讨论】:

    • 如果使用1.20,会报错。 不是反过来吗?您使用没有标头定义的较新版本进行构建,然后使用需要标头定义的旧版本运行它。还是我错过了什么?
    • @IvayloToskov:虽然看起来不直观,但我认为它是正确的:构建版本负责编译。旧的构建版本无法预料 numpy 会发生变化,因此这种类型的设置会产生问题。
    • 经过一番验证,我可以确认确实是相反的。 C API 中的更改是向前兼容的,因为您正在删除标头。如果您使用具有标头的旧版本构建并使用新版本运行它,它不会中断。以下序列产生错误:pip install numpy==1.21.0pip install pycocotools --no-binary pycocotoolspip install numpy==1.19.2python -c "import pycocotools.coco.COCO" 所以当构建版本为>=1.20,运行时版本为<1.20时会发生错误。
    【解决方案4】:

    我在使用 tensorflow 对象 api 时遇到了这个问题。 Tensorflow 目前与 numpy==1.20 不兼容(尽管这个问题直到后来才明显)。 就我而言,问题是由 pycocotools 引起的。我通过安装旧版本来修复。

    pip install pycocotools==2.0.0
    

    【讨论】:

    • 它有自己的问题 - 安装时会删除现有的 cython 安装,然后输出 ModuleNotFoundError: No module named 'Cython'
    • 在我的情况下它没有删除 cython。一切都很好!
    • 这也是我的确切问题。就我而言,效果很好并且没有删除 Cython。
    【解决方案5】:

    不升级的解决方案numpy

    虽然升级numpy 版本通常可以解决问题,但并不总是可行的。一个很好的例子是您使用与最新的numpy 版本不兼容的tensorflow==2.6.0(它需要~=1.19.2)。

    正如FZeiser's answer 中已经提到的,numpys C API 在版本1.20.0 中发生了变化。有些包在构建时依赖于这个 C API,例如pycocotools。鉴于pips 依赖解析器不保证安装包的任何顺序,可能会发生以下情况:

    1. pip 发现它需要安装 numpy 并选择最新版本 1.21.2 在撰写此答案时。
    2. 然后它会构建一个依赖于numpy 及其 C API 的包,例如pycocotools。这个包现在兼容numpy 1.21.2 C API。
    3. 稍后pip 需要安装一个需要旧版本numpy 的软件包,例如tensorflow==2.6.0 将尝试安装 numpy==1.19.5。结果,numpy==1.21.2 被卸载并安装了旧版本。
    4. 在运行使用pycocotools 的代码时,其当前安装依赖于更新的numpy C API,但numpy 版本已降级,这将导致错误。

    解决方案

    您应该使用过时的 numpy C API 用法重新构建包,例如对于pycocotools

    pip uninstall pycocotools
    pip install pycocotools --no-binary pycocotools
    

    【讨论】:

    • 我处于您描述的情况,但是,在使用 pycocotools 2.0.4 时,使用此方法后错误仍然存​​在,但如果我按照@royce schultz 的建议降级到版本 2.0.0,问题就解决了.您使用的是哪个版本的 pycocotools?
    • 我记不太清了,但看看发布历史和这个答案的时间,我认为是2.0.2。尽管出于某种原因,我无法重现 Python 3.8 的问题。你的环境是什么? Python、pipsetuptools 版本?
    • 我正在使用 python 3.8.10,pip 21.3.1,我没有找到使用 pip freeze 的 setuptools 或 easy_tools,但是当我运行“pip install setuptools”时,它说 v 58.5.2 是已安装
    【解决方案6】:

    将 python 版本升级到 numpy ==1.21.1 对我有用!

    【讨论】:

    • 是的,对于二进制不兼容升级或降级软件包很有帮助。
    【解决方案7】:

    对于使用Poetry 的任何人,必须将experimental.new-installer 设置为true 才能正确构建具有numpy<1.20 依赖项的应用程序,即:

    poetry config experimental.new-installer true
    

    默认为true,但如果(我的情况)它已被更改,它会发现你。

    我的应用程序使用 Tensorflow,因此我没有升级到 >1.20 的选项。诗歌也不支持--no-binary依赖。

    【讨论】:

      【解决方案8】:

      对我有用的是:

      pip uninstall numpy
      conda install -y -c conda-forge numpy
      

      听起来很奇怪...我什至不必用 conda 卸载它,这对我来说似乎很奇怪。我正在使用 python 3.9

      【讨论】:

        【解决方案9】:

        在您 pip 安装任何软件包后,请确保您重新启动内核并且应该可以工作。通常软件包会自动升级,您所需要的只是快速重启。至少,这在我的情况下是有效的,当我尝试安装和使用 pomegranate 时遇到了同样的错误。

        【讨论】:

          【解决方案10】:

          numpy 1.22 版为我解决了这个问题。

          【讨论】:

            【解决方案11】:

            升级numpy版本:

            pip install -U numpy
            

            【讨论】:

              【解决方案12】:

              使用python虚拟环境并安装gensim使用:

              pip install gensim==3.8.3
              

              【讨论】:

                【解决方案13】:

                对于几乎相同的图像:python:3.7-slim-buster

                我今天才开始有这个问题,以前是不存在的。

                我通过从 requirements.txt 文件中删除 numpy 并在我的 Dockerfile 中执行以下操作来解决它:

                RUN pip3 install --upgrade  --no-binary numpy==1.18.1 numpy==1.18.1 \
                && pip3 install -r requirements.txt 
                

                我使用了一些旧版本的 keras 及其库,升级到 numpy 1.20.0 对这些库不起作用。但我认为解决方案在于我给你的第一个命令告诉 pip 尝试不编译 numpy 并下载预编译版本。

                命令中的技巧是,您可能会发现有人告诉您使用 pip 的 --no-binary 选项来解决问题,但他们没有指定如何解决问题,而且这可能很棘手(就像我遇到的那样) ;您必须在命令中编写两次包才能使其工作,否则 pip 会抛出错误。

                我认为第一个命令中的 --upgrade 选项不是必需的。

                【讨论】:

                • 对我不起作用,但升级到 1.20.0 确实如此,即使我得到的错误是在加载针对早期版本的 numpy 编译的库的上下文中。
                【解决方案14】:

                安装旧版本的gensim,它可以工作!

                pip install gensim==3.5.0
                

                conda install gensim==3.5.0
                

                【讨论】:

                  【解决方案15】:

                  我在树莓派 3 中遇到了同样的问题。实际上,错误在于 pandas。虽然 tensorflow 需要 numpy~=1.19.2 ,但 pandas 不兼容。所以,我已经将我的numpy 升级(因为没有降级)到最新版本,一切正常!!!!。

                  root@raspberrypi:/home/pi# python3
                  Python 3.7.3 (default, Jan 22 2021, 20:04:44) 
                  [GCC 8.3.0] on linux
                  Type "help", "copyright", "credits" or "license" for more information.
                  >>> import numpy as np 
                  >>> np.__version__
                  '1.21.5'
                  >>> import pandas as pd
                  >>> pd.__version__
                  '1.3.5'
                  >>> import tensorflow as tf
                  >>> tf.__version__
                  '2.4.0'
                  >>> tf.keras.__version__
                  '2.4.0'
                  >>> tf.keras.layers
                  <module 'tensorflow.keras.layers' from '/usr/local/lib/python3.7/dist-packages/tensorflow/keras/layers/__init__.py'>
                  

                  这里也有同样的问题 - https://github.com/bitsy-ai/tensorflow-arm-bin/issues/5

                  张量流来源:https://github.com/bitsy-ai/tensorflow-arm-bin

                  【讨论】:

                    猜你喜欢
                    • 2021-06-14
                    • 2021-10-30
                    • 2021-05-22
                    • 2021-05-17
                    • 2021-06-05
                    • 2022-01-18
                    • 2021-07-06
                    • 2020-06-04
                    • 2021-05-04
                    相关资源
                    最近更新 更多