news 2026/9/20 18:52:18

NumPy 1.21.5 维护版本发布解读:11 项 bug 修复、构建加固与 Python 3.7–3.10 支持清单

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
NumPy 1.21.5 维护版本发布解读:11 项 bug 修复、构建加固与 Python 3.7–3.10 支持清单

NumPy 1.21.5 维护版本发布解读:11 项 bug 修复、构建加固与 Python 3.7–3.10 支持清单

【免费下载链接】numpyThe fundamental package for scientific computing with Python.项目地址: https://gitcode.com/gh_mirrors/nu/numpy

导读

本文基于 NumPy 仓库的官方发布说明 1.21.5-notes.rst,系统梳理 1.21.5 这个维护版本(maintenance release)的全部变更内容:它修复了 1.21.4 之后发现的一批数组核心功能缺陷、构建系统问题与 F2PY 兼容性问题,同时通过构建验证与开发流程加固来延长 1.21.x 分支的生命周期。读完本文,你将清楚掌握该版本支持哪些 Python 版本、gcc-11 环境下编译的注意事项,以及每一个合并 PR 所针对的具体问题,并能在仓库源码与测试中找到对应佐证。

版本定位与适用范围

NumPy 1.21.5 属于 1.21.x 系列的维护性补丁版本,其目标是在不引入新特性的前提下,修复 1.21.4 发布之后发现的一批 bug,并做必要的维护工作以延长 1.21.x 分支的生命周期。

该版本的关键约束条件如下:

项目说明
版本类型维护版本(maintenance release),无新特性
支持 Python 版本3.7 – 3.10
编译器注意事项若使用 gcc-11 自行编译,需使用gcc-11.2+以避免编译问题
合并 PR 数11 个
贡献者人数7 人(其中 Rohit Goswami 为首次贡献)

特别值得强调的是 gcc-11 的编译门槛:如果读者需要从源码构建该版本,应当确认编译器版本不低于 gcc 11.2,否则可能触发已知的编译问题。这一约束在后续 1.21.6 等版本说明中同样延续,属于 1.21.x 生命周期内的固定注意事项。

核心数组功能修复

该版本最值得关注的修复集中在 NumPy 的数组核心路径(对应numpy/_core目录),涉及einsum、结构化 dtype 与类型别名对象三处。

修复 float16 einsum 快速路径使用错误临时变量(PR #20462)

np.einsum在内部针对常见 dtype 会走专门的快速路径(fastpath)以获得更好的性能,而本次修复正是针对 float16(f2)快速路径中**使用了错误的临时变量(wrong tempvar)**导致结果不正确的缺陷。

仓库测试 test_einsum.py 中专门保留了test_einsum_sums_float16用例,对f2dtype 的求和路径进行回归验证;同文件中第 924 行附近的注释也明确记载"该测试最初是为覆盖 float16 路径缺陷(gh-20305)而添加"。从测试结构看,1.21.5 之后einsum的 float16 求和必须与 float32、float64、longdouble 等路径一样通过check_einsum_sums的逐 dtype 校验,这直接对应本次快速路径临时变量错误的修复。

修复创建对齐空结构化 dtype 失败(PR #20466)

结构化 dtype(structured dtype)用于将多个字段打包进一个数组元素。当使用align=True请求字段对齐时,NumPy 会在字段之间插入填充(padding)。本次修复解决了创建"对齐且为空"的结构化 dtype 时直接失败的问题。

对应回归测试位于 test_dtype.py 的test_aligned_empty,其注释明确指出这是针对 gh-19696 的回归测试,覆盖两种等价写法:

dt = np.dtype([], align=True) assert dt == np.dtype([]) dt = np.dtype({"names": [], "formats": [], "itemsize": 0}, align=True) assert dt == np.dtype([])

即空字段列表配合align=True时应得到一个与普通空 dtype 等价的合法 dtype,而不是抛出异常。测试同时验证了子数组字段在对齐时的对齐属性一致性(见同文件的test_alignment)。对于依赖结构化 dtype 做协议解析、内存布局控制的用户,这一修复消除了创建阶段的崩溃风险。

不再转发_GenericAlias__copy__/__deepcopy__调用(PR #20357)

该 PR 属于类型系统维护(MAINT),调整了 NumPy 对 Python 标准库typing_GenericAlias对象的复制行为——不再将其__copy__/__deepcopy__调用向前转发,以避免复制np.ndarray[...]这类泛型别名时产生异常行为。从源码结构看,numpy/_core/src/multiarray下的 descriptor.c、methods.c 与 scalartypes.c.src 均涉及该对象的相关处理,可见它贯穿 dtype 描述、数组方法与标量类型多处,修复价值在于让类型别名对象的复制语义更符合预期。

构建与分发修复

这一组 PR 主要针对源码编译与发行包的构建可靠性,对从源码安装的用户影响最直接。

强制npymath尊重npy_longdouble(PR #20465)

npymath是 NumPy 自带的数学库,其中长双精度(long double)的处理需要与平台类型定义保持一致。该 PR 强制npymath尊重npy_longdouble类型,避免在特定平台(尤其是 long double 与 double 精度不同的架构)上出现类型不匹配。

仓库中的 npy_longdouble.h 定义了npy_longdouble_to_PyLongnpy_longdouble_from_PyLong两个内部 API,用于在 long double 与 Pythonlong整数之间转换(结果向零取整),并强调 long double 具有比 double 更大的数值范围。1.21.5 的这一修复让这些数学转换在构建期统一使用npy_longdouble类型标识,从源码结构看,这是对跨平台数学库类型一致性的一次收敛。

构建前验证 C++ 编译能力(PR #20464)

该 PR 属于构建系统(BLD)加固:在正式编译流程启动之前,先验证当前环境是否具备编译 C++ 源码的能力。这可以提前暴露工具链缺失或配置错误,而不是等到编译中途才失败,从而改善在全新环境(如 CI、Docker)中从源码构建 NumPy 的报错体验。

可执行文件不存在时打印操作系统错误信息(PR #20463)

该 PR 同时涉及 bug 修复与分发(BUG, DIST):当调用某个可执行文件而该文件不存在时,不再只抛出笼统的失败,而是打印出操作系统层的错误信息(如 "No such file or directory"),帮助开发者快速定位是路径拼写错误还是依赖工具未安装。

更新 wheel 以支持 Python 3.10(PR #20495)

作为维护项(MAINT),该 PR 将构建 wheel 所使用的打包工具更新到支持 Python 3.10 的版本。结合本版本声明支持 Python 3.7–3.10 的前提,这确保了官方 wheel 在 Python 3.10 环境下可正常安装运行,是 1.21.x 生命周期延长的直接体现之一。

F2PY 相关修复

F2PY 是 NumPy 中连接 Python 与 Fortran 代码的工具,位于 numpy/f2py 目录,本版本包含两处与它相关的改动。

F2PY 转换中正确清除错误(PR #20497)

该 PR 修复 F2PY 在类型转换过程中错误状态未被正确清除的问题。在 C 扩展的转换逻辑中,如果上一次转换残留了 Python 错误标志(error flag),后续调用可能被污染,导致难以定位的异常行为。本次修复确保 F2PY 的转换代码在合适时机清除错误状态,属于典型的边界条件 bug 修复。

提供替代npy_load_module的便利函数(PR #20467)

该 PR 属于增强(ENH):提供一个新的便利函数以替代内部使用的npy_load_module。这类模块加载辅助函数用于在扩展模块中按名称加载 Python 模块,替换意味着更清晰的职责划分与更易维护的导入路径,属于为后续版本内部重构打基础的维护性增强。

开发流程与生态兼容

最后两个 PR 面向开发工作流与下游生态的稳定性。

添加 warningfilter 修复 pytest 工作流(PR #20613)

作为开发流程修复(DEV),该 PR 为 pytest 工作流添加警告过滤器(warningfilter),使 CI 中因警告被升级为错误(-W error等策略)而失败的任务恢复正常。这保证了 1.21.x 分支的持续集成测试在较新依赖环境下依然可以稳定运行。

帮助 boost::python 库至少不再崩溃(PR #20618)

该 PR 是维护项(MAINT):调整某些行为,使依赖boost::python的下游库"至少不再崩溃"。它并非完整的兼容层实现,而是缓解性的兼容处理,避免 NumPy 与 boost::python 库交互时发生崩溃,体现了维护版本对下游生态的保守兼容态度。

升级与验证建议

对于仍停留在 1.21.x 分支的用户,建议升级到 1.21.5 以获取上述修复。可通过包管理工具安装或升级:

pip install "numpy==1.21.5"

安装后可验证版本号:

import numpy as np print(np.__version__) # 期望输出 1.21.5

若需要在 gcc-11 环境下从源码构建,请务必确保编译器版本不低于 11.2;Python 环境应处于 3.7–3.10 区间。对于结构化 dtype 与einsum(float16)相关的应用,升级后可通过运行仓库自带测试确认修复生效:

python -m pytest numpy/_core/tests/test_dtype.py::TestDTypeMeta::test_aligned_empty python -m pytest numpy/_core/tests/test_einsum.py -k float16

(测试路径以仓库内实际测试类结构为准。)

延伸阅读

  • 官方发布说明原文:doc/source/release/1.21.5-notes.rst
  • 1.21.x 系列其余版本的发布说明,可参见 doc/source/release 目录下对应的1.21.x-notes.rst
  • 历史变更记录汇总:doc/changelog/1.21.5-changelog.rst
  • 核心数组实现与测试:numpy/_core/src/multiarray 与 numpy/_core/tests
  • 长双精度数学库类型定义:npy_longdouble.h
  • F2PY 工具源码:numpy/f2py

【免费下载链接】numpyThe fundamental package for scientific computing with Python.项目地址: https://gitcode.com/gh_mirrors/nu/numpy

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/20 18:51:13

MATLAB入门进阶路径:从矩阵操作到数据可视化与图像处理实战

简介:一套完整的MATLAB语言入门教程PPT,共410页,面向高校本科生、研究生及工程技术人员。内容系统梳理了MATLAB的发展历史与产品家族,介绍了桌面环境、数据可视化、数值计算步骤及规范编程方法,并涉及信号处理、图像处…

作者头像 李华
网站建设 2026/9/20 18:51:08

软著合作开发协议模板:从著作权归属到源代码交付的完整指南

简介:面向软著申请与多方协作开发场景的《合作开发协议模板》,能够帮助软件开发者、高校团队及初创企业提前界定合作各方权责,避免因成果归属、职责不清产生纠纷。协议围绕具体开发项目展开,逐条明确合作宗旨、项目范围、合作期限…

作者头像 李华
网站建设 2026/9/20 18:50:13

国家社科基金申请书写作:拆解成功样本提升立项率的关键方法

简介:一份国家社科基金项目申请书的成功样本解读文档,面向准备申报国家级社科项目的高校教师、科研人员及研究生,用于解决申请书结构陌生、填写规范不清晰等常见问题。资源包内仅含一个Word文档,容量约89KB,从封面登记…

作者头像 李华
网站建设 2026/9/20 18:49:43

GaN基Micro-LED高光效仿真建模:从效率衰减到结构优化

简介:文档围绕高光效GaN基Micro-LED仿真模型展开,面向从事Micro-LED显示器件设计、光学仿真及半导体光电器件研究的工程师与科研人员,聚焦芯片微缩带来的侧壁效应导致正向光提取效率(LEE)下降这一关键问题。内容基于有…

作者头像 李华
网站建设 2026/9/20 18:49:12

无人售货机高并发库存扣减的异步化改造实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华