数值错误: numpy.ndarray 大小改变,可能表示二进制不兼容。预计从 C 头88,从 PyObject 得到80

从 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.

有没有人在使用 Python 3.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
242465 次浏览

尽管其他情况不同(python3.8 on alpine 3.12) ,尝试使用 numpy==1.20.0在这里工作。

几乎相同的图片: python: 3.7-Slim-buster

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

我解决这个问题的方法是,从 requment.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 的非二进制选项来解决问题,但是他们没有指定如何解决,而且可能很棘手(就像我遇到的那样) ; 你必须在命令中写两次软件包才能正常工作,否则 pip 会抛给你一个错误。

我认为没有必要在第一个命令中使用—— update 选项。

我在 Python 3.8.5中。这听起来太简单了,不像是真的,但是我遇到了同样的问题,我所做的就是重新安装 numpy。消失了。

pip install --upgrade numpy

或者

pip uninstall numpy
pip install numpy

我在使用张量流对象 api 时遇到了这个问题。Tensorflow 目前与 numpy = = 1.20不兼容(尽管这个问题直到以后才显现出来)。 在我的案例中,这个问题是由 pycotools 引起的,我通过安装一个旧版本来解决这个问题。

pip install pycocotools==2.0.0

事实上,用 numpy>=1.20.0构建和安装应该可以工作,正如这个 回答如下指出的那样。然而,我认为一些背景知识可能会很有趣——并且还提供了其他的解决方案。

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

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

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

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

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

对于任何使用 诗歌的人来说,必须将 experimental.new-installer设置为 true,这样才能正确构建具有 numpy<1.20依赖关系的应用程序,即:

poetry config experimental.new-installer true

它默认是 true,但是如果(就像我的情况一样)它已经被改变了,它可以抓住你。

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

在 pip 安装任何软件包之后,请确保重新启动内核并应该可以工作。通常软件包会自动升级,所有你需要的是一个快速重启。至少,这是什么工作在我的情况下,我得到了同样的错误,当我试图安装和使用石榴。

对我起作用的是:

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

虽然听起来很奇怪,但我甚至不需要用 Conda 卸载它,这对我来说很奇怪。我用的是 python 3.9

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

使用 python 虚拟环境并使用以下方法安装 gensim:

pip install gensim==3.8.3

升级麻木版本:

pip install -U numpy

无需升级 numpy的解决方案

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

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

  1. pip计算出它需要安装 numpy,并选择了最新的版本,1.21.2作为写这个答案的时间。
  2. 然后构建一个依赖于 numpy及其 CAPI 的包,例如 pycocotools。此包现在与 numpy 1.21.2CAPI 兼容。
  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

安装老版本的 Gensim,它的工作!

pip install gensim==3.5.0

或者

conda install gensim==3.5.0

麻木版1.22帮我解决了这个问题。

我在树莓 pi 3里也遇到过同样的问题。实际上错误出在 pandas上。虽然张量流需要 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

这对我很有效(当这个页面上没有其他内容的时候) :

# Create environment with conda or venv.
# Do *not* install any other packages here.
pip install numpy=1.21.5
# Install all other packages here.
# This works as a package may build against the currently installed version of numpy.

这解决了一个特别残酷的问题,而这个问题在2022-04-11年的时候是本页所有其他答案都无法解决的:

其他答案尝试修复问题 之后它发生,这修复问题 之前它发生。

此外,还可以尝试不同版本的 Python,例如3.8、3.9、3.10。

参考文献:@FZeiser 给出了很好的答案,解释了为什么这种方法有效。

我在 python3.10.4,numpy1.21.5中遇到过同样的问题,我只是在通过 pip 卸载 numpy 和 pip 安装 numpy 将 numpy 更新为1.22.3后才解决了这个问题。只有 pip 安装——升级 numpy 不起作用。

PS D: quant vnpy-master 示例 veighna _ trading > python. run.py 回溯(最近一次调用) : 文件 “ D: quant vnpy-master 示例 veighna _ trading run.py”,第31行,in 从 vnpy _ optionmaster 导入 OptionMasterApp 文件 “ D: it _ soft python3.10.4 Lib site-package vnpy _ optionmaster _ _ init _ _ py”, 第26行,在 from. engine import OptionEngine,APP _ NAME 文件中 “ D: it _ soft python3.10.4 Lib site-package vnpy _ optionmaster engineering.py”, 第34行,从。定价导入二项式 _ tree _ cython 作为 在 init 文件中,第1行是“ binovan _ tree _ cython. pyx” 二项式 _ tree _ cython ValueError: numpy.ndarray 大小改变,可能 表示二进制文件不兼容。预期从 C 头得到96,得到88 来自 PyObject

安装老版本的 gensim 工程!

pip install gensim==3.5.0

我有这个问题,但不能更新 numpy,因为一些不兼容的冲突,我需要的另一个包,需要 numpy<=1.21.0。错误 numpy.ndarray size changed, may indicate binary incompatibility是从个人软件包生成的。解决方案是修改包的 pyproject.toml文件并设置:

requires = ["numpy==1.21.0", <other packages>]

这是以前设置为 "numpy>=1.21.0",造成错误。