资讯动态

NumPy 1.23.2 维护版本解读:Python 3.11 类型标注适配与关键 Bug 修复

发布时间:2026/9/20 22:12:53 来源:尧图企业网站定制
NumPy 1.23.2 维护版本解读Python 3.11 类型标注适配与关键 Bug 修复【免费下载链接】numpyThe fundamental package for scientific computing with Python.项目地址: https://gitcode.com/gh_mirrors/nu/numpyNumPy 1.23.2 是一个维护版本maintenance release发布于 1.23.1 之后集中修复该版本发现的缺陷其两大亮点分别是面向 Python 3.11 的类型标注typing变更以及提供 Python 3.11.0rc1 的预编译 wheels。阅读本文你将完整了解该版本的所有改动清单、每条变更对应的仓库源码佐证以及升级到该版本时值得关注的行为变化。版本定位与支持范围NumPy 1.23.2 不引入新的公开 API 或大规模架构改动而是延续 1.23.x 分支的稳定性策略属于小步快跑式的补丁发布。官方发布说明明确两点性质修复 1.23.1 发布之后发现的 bugdoc/source/release/1.23.2-notes.rst。支持范围该版本支持的 Python 版本为3.8 ~ 3.11。值得注意的是Python 3.11 在当时仍处于 RCRelease Candidate阶段NumPy 在 1.23.2 中提前完成类型标注适配并构建了 3.11.0rc1 的 wheels为 Python 3.11 正式发布后的无缝衔接做准备。亮点一面向 Python 3.11 的类型标注变更这是本版本的重头戏共涉及 6 个类型标注TYP相关 PR覆盖 ufunc 协议、标量比较、数组方法 overload 等多个维度。1.__array_ufunc__的nin1ufunc 类型支持PR #22030__array_ufunc__是 NumPy 的 ufunc 分发协议允许自定义类拦截并接管 ufunc 调用。在 1.23.2 之前类型标注体系对一元 ufuncnin1的支持不完整。该 PR 补齐了这部分 typing 支持。从当前仓库的 numpy/_typing/_ufunc.pyi 可以印证这一演进方向的最终落地形态ufunc被拆分为四个私有子类分别对应nin输入参数个数与nout输出个数的不同组合例如_PyFunc_Nin1_Nout1类中nin被精确标注为Literal[1]同时通过_SupportsArrayUFunc协议定义__array_ufunc__的完整签名其method参数限定为__call__、reduce、reduceat、accumulate、outer、at六种取值。这种按 nin/nout 组合拆分子类的设计正是为了让一元/二元 ufunc 各自的 overload 签名更精确、更易于被静态类型检查器如 mypy、pyright理解。2. 修复np.angle的 dtype-overloadsPR #22031np.angle用于计算复数的辐角其返回值 dtype 随输入 dtype 变化。该 PR 修正了它的类型重载使np.angle在不同输入类型下能推断出正确的返回类型。仓库中 numpy/lib/_function_base_impl.pyi 展示了修复后的 overload 结构例如输入np.complex64返回np.float32、输入np.clongdouble返回np.longdouble、输入复数列表返回NDArray[np.float64]而通用回退重载则返回NDArray[np.floating] | Any。这与运行时实现 numpy/lib/_function_base_impl.py 中的def angle(z, degFalse)形成一一对应。3. 阻止_GenericAlias包裹底层类PR #22032Python 3.11 中types.GenericAlias的行为有所变化该 PR 避免在类型标注场景下让_GenericAlias意外包裹 NumPy 的底层类防止出现np.ndarray[int]之类的泛型别名被错误地套用到不应泛型化的类上从而保证__class_getitem__相关逻辑在 3.11 下行为一致。4.einsum允许通过整数下标传入 subscriptsPR #22033np.einsum的subscripts参数传统上以字符串形式书写如ij,jk-ik。该 PR 在类型层面允许通过整数SupportsIndex构造的下标传入。从 numpy/_typing/_ufunc.pyi 中导入的SupportsIndex类型可以印证该方向einsum相关的 overload 需要同时覆盖字符串下标与整数下标两种调用形态。5.np.generic富比较操作的对象 overloadPR #22034np.generic是所有 NumPy 标量类型的基类。Python 3.11 对富比较运算符、!、、、、的类型推断更为严格该 PR 为np.generic补充了接受对象类型object的 overload确保标量与任意对象比较时类型标注不报错。6. 允许squeeze与transpose方法的类级重载PR #22035数组的ndarray.squeeze与ndarray.transpose方法签名随传入参数变化很大。该 PR 调整了这两个方法的 overload 声明方式使其可以在方法层面而非仅函数层面精确描述各参数组合的返回类型。仓库中 numpy/_core/fromnumeric.pyi 的squeezeoverload 序列覆盖标量输入、0 维数组、普通数组、ArrayLike回退等多种形态正是此类精细化标注的体现。亮点二Python 3.11.0rc1 wheels本版本的第二个直接亮点是为 Python 3.11.0rc1 构建并发布预编译 wheelsPR #22115。这意味着 Python 3.11 用户在 RC 阶段即可通过pip install numpy1.23.2直接安装二进制包无需本地编译。相关构建层面的配套改动还包括PR #22078重排头文件 include 顺序便于在系统已安装 NumPy 的环境中做源码级测试避免头文件版本冲突。PR #22057静默 anaconda 上传过程减少 CI 构建日志噪音属于发布工程release engineering层面的改进。Bug 修复明细除类型标注外本版本还修复了若干运行时与构建期缺陷PR类型内容仓库佐证#22036BUG修复 subarray 转 object 转换时的所有权ownership细节问题避免子数组视图在转换后出现所有权归属错误与numpy/_core中PyArray_Subarray相关转换路径对应#22037BUG使用Popen静默调用f77 -v避免构建期探测 Fortran 编译器版本时输出干扰信息numpy/f2py/crackfortran.py 中大量f77/strictf77编译选项逻辑以及 numpy/_build_utils/gitversion.py 中subprocess.Popen的既有用法#22038BUG修复 deepcopy 过程中遇到NULL指针时抛错的问题增强对象拷贝的健壮性对应_core中数组对象__deepcopy__路径这些修复共同保障了数组转换、拷贝与构建探测三个环节的稳定性对下游科学计算生态的长期依赖尤为重要。测试修复精确性验证的加固本版本还包含两个针对既有测试的修复均与浮点精度验证相关PR #22106修复test_linear_interpolation_formula_symmetric。该测试验证线性插值公式的对称性lerp(a, b, t)与交换端点后的lerp(b, a, 1-t)应得到相同结果。从 numpy/lib/tests/test_function_base.py 可以看到该测试的实现——注释明确指出double subtraction is needed to remove the extra precision of t 0.5双重减法用于消除t 0.5时的额外精度这正是 IEEE 754 浮点运算中消除中间精度残留的经典手法。该测试基于 Hypothesis 做属性测试property-based testing对t ∈ [0,1]、a、b ∈ [-1e300, 1e300]的随机浮点组合断言结果一致。PR #22107修复test_loss_of_precision[complex256]的跳过skip条件。该测试位于 numpy/_core/tests/test_umath.py用于检查复数反双曲函数如arcsinh在complex64、complex128、clongdouble三种精度下的精度损失。修复前的跳过条件不够精确修复后补充了对非 x86_64 平台及 Android 等环境的显式跳过判定见源码中platform.machine() ! x86_64与sys.platform android的判断以及 glibc 2.18 以下的 xfail 标记使该测试在 musllinux、aarch64、s390x、ppc64le 等平台上不再误报失败。这两处修复本身不改变用户可见行为但保证了 CI 在多种平台/编译器组合下的测试结果可信属于维护版本中典型的测试基础设施工作。贡献者与合并 PR 汇总本版本共由9 位贡献者完成其中 Alexander Grund、Jon Cusick、Michael Osthege、Pal Barta 四位为首次向 NumPy 提交补丁的新贡献者名字后带 标记Alexander Grund 、Bas van Beek、Charles Harris、Jon Cusick 、Matti Picus、Michael Osthege 、Pal Barta 、Ross Barnowski、Sebastian Berg合计15 个 PR被合并涵盖类型标注6 个、运行时 Bug 修复3 个、测试修复2 个、构建与发布工程3 个以及文档改进1 个PR #22039 为 converter 可调用对象行为补充了versionchanged说明。升级建议对于使用 Python 3.8 ~ 3.10 的用户1.23.2 主要带来稳定性提升建议通过pip install --upgrade numpy平滑升级对于 Python 3.11 的早期采用者该版本是当时首个提供 3.11 RC wheels 的正式维护版本强烈建议使用。如果项目重度依赖类型标注如使用 mypy/pyright 对 NumPy 代码做静态检查本版本对 ufunc 协议、np.angle、squeeze/transpose等标注的修正值得重点关注因为这些改动直接影响 3.11 环境下类型检查器的推断结果。需要注意的是本文引用的仓库源码为当前主线版本其中类型标注实现如numpy/_typing/_ufunc.pyi的四类 ufunc 子类结构已在此基础上持续演进阅读时请以实际安装版本为准。【免费下载链接】numpyThe fundamental package for scientific computing with Python.项目地址: https://gitcode.com/gh_mirrors/nu/numpy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价