直接装 numpy==1.26.2 和 scipy==1.10.0 会报错,因为 SciPy 1.10.0 要求 NumPy 版本 ≥1.19.5 且

直接装 numpy==1.26.2 和 scipy==1.10.0 就会报错,因为 SciPy 1.10.0 要求 NumPy 版本 ≥1.19.5 且
查清当前环境到底在用哪个 NumPy 和 SciPy
别信 pip list 的表面排序,得确认解释器实际加载的是哪个路径下的包:
- 运行
python -c "import numpy; print(numpy.__version__, numpy.__file__)"和python -c "import scipy; print(scipy.__version__, scipy.__file__)",看输出的__file__路径是否一致(比如都落在miniconda3/envs/myenv/lib/python3.10/site-packages/) - 如果路径混杂(例如一个在
/usr/local/lib/...,一个在~/miniconda3/...),说明你没激活正确的虚拟环境,或者系统 Python 和 conda 环境被 PATH 混淆了 -
pip show numpy scipy输出的Required-by:字段能暴露谁在暗中锁版本(比如scikit-learn可能要求numpy)
用 conda 而不是 pip 安装 SciPy(尤其在 Python 3.10 下)
conda 自带版本约束求解器,能自动对齐 NumPy、SciPy、BLAS 底层库三者。pip 在 Python 3.10+ 上对二进制 wheel 的 ABI 兼容性判断较弱,容易装出“能 import 但一调用就 segfault”的组合。
- 先清掉 pip 装的干扰项:
pip uninstall numpy scipy -y - 再用 conda 装(推荐 conda-forge 渠道,更新快、Python 3.10 支持更稳):
conda install -c conda-forge numpy scipy python=3.10 - 如果已有环境,加
--force-reinstall强制重连底层符号:conda install -c conda-forge scipy --force-reinstall
遇到 “ndarray size changed” 报错时别急着降级 NumPy
这个错误本质是 C 扩展模块(比如 scipy.linalg 或某个旧版 cv2)编译时链接的 NumPy 头文件版本,和当前运行时 NumPy 的 C API 布局不一致。强行降级 NumPy 可能让其他依赖它的库(如 PyTorch)崩溃。
- 先定位罪魁祸首:
python -c "import scipy.linalg; scipy.linalg.svd([[1]])"—— 如果这行就崩,问题在 SciPy;如果只在导入cv2或sklearn后崩,问题在它们 - 对 SciPy 本身:优先尝试
conda install -c conda-forge scipy=1.12.0(它明确支持 NumPy 1.22.4+,兼容 1.26.x 的 C API) - 若必须用旧 SciPy(如 1.9.x),则只能配旧 NumPy:
conda install numpy=1.21.6 scipy=1.9.3,别用 pip 降级,避免头文件和 so 文件版本错位
为什么 virtualenv + pip 在 Python 3.10 科学计算中容易翻车
virtualenv 只隔离 Python 包路径,不管理 BLAS、LAPACK、OpenMP 这些 SciPy 依赖的系统级数学库。你在同一台机器上用 pip 装了两次 NumPy,可能一次连 OpenBLAS,一次连 Reference BLAS,而 SciPy 编译时绑定的是前者,运行时却加载了后者 —— 这种隐式冲突不会报错,但结果随机出错。
- Miniconda 是底线:哪怕不用 conda-forge,也至少用
conda create -n py310-scipy python=3.10 numpy scipy初始化环境 - 不要在 base 环境里混装:base 是 conda 的管理环境,装太多科学计算包容易破坏 conda 自身更新逻辑
- 镜像加速关键:
conda config --add channels conda-forge && conda config --set channel_priority strict,否则默认 channel 可能拉来过时的 SciPy 二进制包
真正卡住的点往往不是“该装哪个版本”,而是“哪个 Python 解释器正在执行这段 import”。同一个 shell 里 which python 和 python -c "import sys; print(sys.executable)" 输出不一致,就说明 PATH 或 shebang 已经失控 —— 这时候重装包毫无意义。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











