
NumPy 1.24.3 发布说明解读维护性版本中的回归修复与源码级原理剖析【免费下载链接】numpyThe fundamental package for scientific computing with Python.项目地址: https://gitcode.com/gh_mirrors/nu/numpyNumPy 1.24.3 是一个维护性发布版本maintenance release专门修复 1.24.2 发布后被发现的 bug 与回归问题支持 Python 3.8–3.11。本文基于 1.24.3 发布说明 逐条解析本次合并的 17 个 pull request 所修复的问题类别——掩码数组MaskedArray行为、datetime64/timedelta64 比较语义、s390x 平台大数组 I/O、f2py 字符串标量以及类型标注修正——并结合当前仓库中的 C 源码与 Python 实现解释这些修复背后的底层机制帮助读者理解 NumPy 维护性版本的典型修复模式。版本定位什么是维护性发布发布说明开篇明确了 1.24.3 的性质NumPy 1.24.3 is a maintenance release that fixes bugs and regressions discovered after the 1.24.2 release. The Python versions supported by this release are 3.8-3.11.即不引入新功能只修复 1.24.2 之后发现的问题Python 支持范围为 3.8–3.11升级 1.24 系列补丁版本可以安全替换二进制 ABI 与 1.24.x 系列内保持一致对生产环境而言1.24.3 是 1.24 系列中值得部署的收口版本。本次发布共有12 位贡献者其中 Aleksei Nikiforov 为首次贡献合并了17 个 pull request。发布说明中Pull requests merged一节的完整清单即为该版本的全部变更内容PR 编号类型修复/变更内容#23206BUGf2py 字符串标量修复对应问题 #23194#23207BUGdatetime64/timedelta64 比较返回 NotImplemented#23208MAINTrefguide 检查中固定 matplotlib 3.6.3#23221DOC修复文档中 matplotlib 报错#23226CI确保 gitpod 中初始化子模块#23341TYP用 reduceat 替换 ufunc 类型签名中重复的 reduce#23342TYP移除__init__.pyi中重复的 CLIP/WRAP/RAISE#23343TYP标记 fftfreq/rfftfreq 的d参数为可选#23344TYP为 MaskedArray 比较运算符补充类型标注#23345TYP移除msort的多余 type-check-only 导入#23370BUG确保like只在like分发函数中被剥离#23543BUG修复 s390x 上大数组的加载与存储#23544MAINT升级 circleci-artifacts-redirector-action#23634BUG掩码 setitem 中忽略 invalid/overflow 警告#23635BUG修复orderA或orderK时掩码数组的 ravel#23636MAINT适配新版 hypothesis 的 conftest 更新#23637BUG修复 F77 风格字符串数组解析从类型前缀BUG/MAINT/DOC/CI/TYP可以看出维护版本的构成真正的行为修复集中在 6 个 BUG 类 PR其余为类型标注、CI 与构建维护。下文按主题展开其中最关键、对使用者影响最大的几类修复。修复一datetime64/timedelta64 比较应返回 NotImplementedPR #23207问题背景Python 的比较运算符、等会调用__eq__/__lt__等丰富比较方法rich comparison。当两个对象类型无法比较时正确做法是返回NotImplemented把比较让渡给对方类型或最终回退为is语义。在 1.24.2 中datetime64/timedelta64相关数组/标量在与某些非时间类型比较时没有正确返回NotImplemented导致跨类型比较行为不符合 Python 数据模型例如本应False的相等性判断出现异常结果。该修复使时间类型在无法执行比较时统一返回NotImplemented。源码级印证NumPy 数组的__richcompare__实现在 C 层 arrayobject.c 中。当前仓库源码中可以看到多处标准的 NotImplemented 让渡模式例如 arrayobject.cPy_INCREF(Py_NotImplemented); return Py_NotImplemented;这些分支出现在比较操作无法按元素逐位执行的路径上如维度/类型不匹配且无法广播时。#23207 的修复正是补齐 datetime 类型族在这些比较路径上的 NotImplemented 返回使其与通用数组行为一致。datetime 类型的核心实现位于 datetime.c类型元数据层对 NotImplemented 的统一处理可见 abstractdtypes.celse if (res (PyArray_DTypeMeta *)Py_NotImplemented) { ... Py_INCREF(Py_NotImplemented); return (PyArray_DTypeMeta *)Py_NotImplemented;对使用者的影响修复后以下模式的行为符合 Python 语义import numpy as np t np.datetime64(2024-01-01) # 与无法比较的对象比较时比较让渡最终回退到 is 语义 (t 2024-01-01) # 按 dtype 规则执行 (np.array([1], dtypeM8[s]) np.array([2], dtypeM8[s])) # [False]修复二掩码数组 orderA/K 下的 ravel 修复PR #23635问题背景np.ma.MaskedArray.ravel()支持order参数C/F/A/K但 1.24.2 中在orderA或orderK时data与mask两块底层数组可能具有不同的内存顺序_data是 C 连续而_mask是 F 连续或反之若直接按同一个order分别 ravel 两者展开后的元素与掩码位置会错位——即某个元素被错误地标记为掩码或未掩码。源码级印证当前仓库 ma/core.py 中的ravel实现完整保留并注释了该问题的处理逻辑core.py# The order of _data and _mask could be different (it shouldnt be # normally). Passing order K or A would be incorrect. # So we ignore the mask memory order. # TODO: We dont actually support K, so use A instead. We could # try to guess this correct by sorting strides or deprecate. if order in kKaA: order F if self._data.flags.fnc else C r ndarray.ravel(self._data, orderorder).view(type(self)) r._update_from(self) if self._mask is not nomask: r._mask ndarray.ravel(self._mask, orderorder).reshape(r.shape)从源码结构看修复策略是当用户传入K/A时以data的实际内存连续性为准将其规范化为FFortran 连续或C并用这个统一后的order同时展开_data与_mask从而保证两者元素一一对应。文档字符串中也保留了明确说明Masked arrays currently use A on the data when K is passed.core.py。注意源码中的 TODO 注释表明K顺序实际并未被完整支持而是近似为A的语义这是当前实现的已知限制。可验证示例ravel的官方 docstring 示例core.py可直接运行验证import numpy as np x np.ma.array([[1,2,3],[4,5,6],[7,8,9]], mask[0] [1,0]*4) x.ravel() # masked_array(data[1, --, 3, --, 5, --, 7, --, 9], # mask[False, True, False, True, False, True, False, True, False], # fill_value999999)修复三掩码 setitem 中的 invalid/overflow 警告抑制PR #23634MaskedArray.__setitem__在写入被掩码位置时底层 C 代码仍可能对目标内存执行赋值从而触发RuntimeWarning: invalid value encountered in ...或overflow encountered in ...——但被掩码位置的值最终不会被使用这类警告属于噪声。#23634 让掩码 setitem 路径在目标位置被掩码时忽略 invalid 与 overflow 警告。掩码共享语义在 ma/core.py 中以_sharedmask标志贯穿如 core.py 中sharedMask属性的处理这是理解掩码数组赋值行为的关键内部状态。修复四s390x 大数组加载与存储PR #23543np.load/np.save在 s390xIBM 大型机大端 64 位平台上处理超过 2GB 的大数组时会出错1.24.2 中相关长度/偏移量在某些路径上使用了 32 位整型超过2^31字节边界时发生截断或溢出。#23543 将.npy/.npz读写路径中涉及大偏移的计算改为 64 位宽度修复 s390x 上大文件的加载与保存。当前仓库中大数组测试的验证方式见 test_io.py 的test_big_arrays通过np.lib.format写入超大尺寸声明来验证边界处理平台相关的 CPU 特征探测在 npy_cpu_features.c 中对 s390x 有专门的特性位处理。修复五f2py 字符串标量与 F77 风格字符串数组PR #23206、#23637f2py 生成代码中存在两处字符串处理回归字符串标量#23206对应问题 #23194FortranCHARACTER标量参数在封装层返回/接收时的处理修复涉及 f2py 的 Fortran 解析核心 crackfortran.py 与回调/包装规则 cfuncs.pyF77 风格字符串数组解析#23637Fortran 77 源码中CHARACTER*(n)声明形式的字符串数组解析错误同样由 crackfortran.py 中的声明解析器处理。若项目通过 f2py 封装 Fortran 代码且涉及CHARACTER类型接口升级到 1.24.3 可消除标量字符串参数传递与 F77 源码解析的异常。修复六like参数剥离逻辑PR #23370NumPy 的 array-function 协议支持like参数进行数组类型分发见numpy/core/overrides.py与 arrayfunction_override.c。#23370 修复了参数清洗逻辑中的一个回归like关键字原本只在支持like分发的函数中才被剥离处理1.24.2 的错误实现扩大了剥离范围可能影响不接受like的函数。源码中分发层对 NotImplemented 的让渡逻辑arrayfunction_override.cReturn a borrowed reference of Py_NotImplemented to defer back to是该机制的基础。类型标注TYP类变更静态检查体验改善五个 TYP 类 PR 不改变运行时行为只修正*.pyi存根与类型签名#23341ufunc 类型签名中reduce被重复声明改为以reduceat表达避免静态检查器报重复定义#23342numpy/init.pyi 中CLIP/WRAP/RAISE重复导出它们实际定义于numpy/exceptions.py去重后静态导入解析更干净#23343fftfreq/rfftfreq的d参数标注为可选——实际实现中该参数缺省时默认取1.0#23344MaskedArray的比较运算符__lt__、__eq__等补齐返回类型标注#23345清理__init__.py中仅用于 type-checking 的msort导入。这些变更影响 mypy/pyright 等静态工具对 NumPy 的推断质量使用严格类型检查的第三方库升级存根时可关注。构建与 CI 维护类变更MAINT/DOC/CI#23208 #23221refguide参考指南一致性检查依赖 matplotlib将其固定到 3.6.3 以稳定文档检查环境#23226gitpod 环境需初始化 git 子模块NumPy 文档/构建依赖子模块否则容器内 CI 直接失败#23544升级 CircleCI 制品重定向 action保证构建产物链接可用#23636适配新版 hypothesis属性测试库的 conftest 变更测试基础设施位于 numpy/conftest.py。升级建议与适用前提升级动机如果你在 1.24.x 线上使用了datetime64/timedelta64跨类型比较、MaskedArray.ravel(order...)、大端平台大数组 I/O 或 f2py 字符串接口1.24.3 是必须跟进的补丁版本适用前提1.24 系列支持 Python 3.8–3.11从 1.24.3 起 NumPy 尚未移除 1.x 已弃用 API2.0 才执行大规模移除因此 1.24.3 仍是 1.x 生态兼容的选择之一验证方式升级后可运行仓库自带测试确认环境例如掩码数组行为测试 numpy/ma/tests/、I/O 测试 numpy/lib/tests/test_io.py后续演进当前仓库主线NumPy 2.x 开发版已将这些修复包含在内且numpy.ma、datetime.c、f2py 解析器等模块结构已迁移如numpy/core重命名为numpy/_core阅读本仓库源码时注意与 1.24.3 发布时刻的目录差异——例如本文引用的 numpy/_core/src/multiarray/arrayobject.c 在 1.24 时代位于numpy/core/src/multiarray/。总结NumPy 1.24.3 是一个典型的收口式维护版本17 个 PR 中 6 个 BUG 修复全部针对可复现的行为回归时间类型比较语义、掩码数组顺序处理、setitem 警告噪声、s390x 大文件 I/O、f2py 字符串接口5 个 TYP 修复改善静态类型体验其余为 CI 与文档基础设施维护。对使用者它是 1.24 系列的安全升级终点对读者本文展示的发布说明条目 → C/Python 源码路径的追踪方法同样适用于解读 NumPy 任意后续维护版本的 release notes。【免费下载链接】numpyThe fundamental package for scientific computing with Python.项目地址: https://gitcode.com/gh_mirrors/nu/numpy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考