拓冰建站拓冰建站
首页 / 资讯中心 / 正文

NumPy 1.16.6 发布说明解读:末代 Python 2.7 系列的维护更新与关键修复

NumPy 1.16.6 发布说明解读末代 Python 2.7 系列的维护更新与关键修复【免费下载链接】numpyThe fundamental package for scientific computing with Python.项目地址: https://gitcode.com/gh_mirrors/nu/numpy本篇文章围绕 NumPy 1.16.6 的官方发布说明展开梳理该维护版本针对 1.16.5 报告的缺陷所进行的修复、从 master 分支回迁的增强特性以及面向下游开发者的构建与兼容性要点。读完本文你将清楚了解 LTS 1.16 系列在 Python 2.7 支持收官阶段的技术决策掌握 matmul 对象数组支持、布尔类型回归修复、测试断言信息增强等核心变更的来龙去脉与底层实现。发布背景与定位NumPy 1.16.6 是 1.16 系列的第 6 个维护版本它的定位非常明确修复针对 1.16.5 报告的问题并回迁若干来自 master开发主干的增强。1.16 系列是 NumPy 最后一个支持 Python 2.7 的发布系列因此本次发布兼具收尾维护与能力补强的双重性质。从发布说明中可以看到几个关键事实本次发布共合入14 个 Pull Request有10 位贡献者参与含 CakeWithSteak、Charles Harris、Chris Burr、Eric Wieser、Fernando Saravia、Lars Grueter、Matti Picus、Maxwell Aladago、Qiming Sun、Warren WeckesserPyPI 上的 wheel 二进制包链接到OpenBLAS v0.3.7用于修复 Skylake 系列 CPU 上的错误支持的 Python 版本为2.7 与 3.5–3.7对下游构建者的要求是Cython 0.29.2若使用 OpenBLAS 则需OpenBLAS v0.3.7。Highlights测试工具从 1.19.0-dev0 回迁本次发布最重要的整体增强是np.testing.utils中的函数已从 1.19.0-dev0 更新到本版本。这一回迁带来了三方面收益改善了函数文档字符串docstring与错误信息将assert_array_compare函数的适用范围扩展到更多数据类型为后续小节介绍的错误信息包含最大差值特性奠定了基础。在当前的仓库结构中这部分代码位于 numpy/testing/_private/utils.py其中的核心函数assert_array_compare定义于 第 759 行是所有数组比较断言的底层公共实现。assert_allclose、assert_array_almost_equal等测试工具最终都汇聚到这一函数上完成元素级比较与错误报告因此改进它对整个测试体系的报错质量都有全局提升。新功能matmul运算符支持对象数组1.16.6 将原本在 NumPy 1.17 中引入的增强回迁到了 1.16 LTS 系列matmul即运算符现在可以作用于 object 数组。这一能力使得矩阵乘法可以应用于包含任意 Python 对象的数组。从当前仓库的测试用例 numpy/_core/tests/test_multiarray.py 可以印证其用法例如 test_matmul_object第 8666 行 使用fractions.Fraction构造 object 数组并执行矩阵乘法再通过与浮点数组的matmul结果比对验证正确性而 test_matmul_object_type_scalar第 8682 行 进一步验证了标量对象如Fraction参与matmul时返回类型保持为原对象类型from fractions import Fraction as F import numpy as np v np.array([F(2, 3), F(5, 7)]) res np.matmul(v, v) # 等价于 v v assert type(res) is F # 结果保持 Fraction 类型在实际使用中这意味着你可以直接用对dtypeobject的数组做矩阵乘法例如存储分数、Decimal 或其他自定义数值类型的数组而无需像过去那样依赖np.dot的某些路径或手动循环。兼容性修复布尔类型 matmul 回归新功能引入的同时发布说明也记录了需要警惕的兼容性修复修复了 matmul运算符针对布尔类型的回归。此前布尔值在矩阵乘法中被当作整数处理而不是布尔值这与历史行为不符。在 1.16.6 中布尔类型的matmul行为被恢复为按布尔逻辑and/or语义进行乘加运算。这一点对使用布尔掩码矩阵进行链式运算的用户尤为重要——升级到 1.16.6 后相关运算结果会与旧版本行为一致无需修改业务代码。对应的修复 PR 为#14509BUG: Fix regression in boolean matmul。改进数组比较断言报告最大差值1.16.6 对测试断言体系的一个重要改进是数组比较测试如testing.assert_allclose的错误信息现在除了原有的 mismatch 百分比外还包含 max absolute difference最大绝对差与 max relative difference最大相对差。这一信息使得开发者更容易据此调整绝对与相对误差容限atol/rtol。在当前仓库的实现中可以在 numpy/testing/_private/utils.py 的assert_array_compare函数内看到这段逻辑对应第 961–1002 行with errstate(allignore): # ignore errors for non-numeric types with contextlib.suppress(TypeError): error abs(x - y) ... reduced_error error[invalids] max_abs_error max(reduced_error) remarks.append( Max absolute difference among violations: str(max_abs_error)) # note: this definition of relative error matches that one # used by assert_allclose (found in np.isclose) nonzero np.bool(y ! np.zeros_like(y)) nonzero_and_invalid np.logical_and(invalids, nonzero) ... max_rel_error max(nonzero_invalid_error / abs(nonzero_invalid_y)) remarks.append( Max relative difference among violations: str(max_rel_error))从源码可以看出几个值得注意的实现细节绝对误差通过abs(x - y)计算并对无符号整数类型做了abs(y - x)的对称处理取两者最小值以规避无符号整型下溢问题相对误差的定义与assert_allclose所用的np.isclose保持一致即|x - y| / |y|并且会过滤掉除数为零的位置若所有不匹配位置的分母都为零则max_rel_error报告为inf报告按违规位置invalids而非全数组计算因此给出的差值反映的是失败元素中的最大偏差比全数组最大差更有诊断价值错误信息中还附带不匹配元素数量、百分比以及前 5 个不匹配位置的索引与数值见第 933–959 行方便快速定位问题元素。例如当assert_allclose失败时典型的错误输出会包含类似如下结构Mismatched elements: 1 / 4 (25%) Max absolute difference among violations: 0.5 Max relative difference among violations: 0.1借助这些数值你可以直接判断失败是由绝对误差还是相对误差引起从而决定调整atol绝对容限还是rtol相对容限。相关的修复与回迁 PR 包括#14434BUG: Fixed maximum relative error reporting in assert_allclose与#15172ENH: Backport improvements to testing functions。其他重要缺陷修复一览除上述主题外1.16.6 还合入了多方面的缺陷修复与构建调整按 PR 归类如下PR类型内容#14211BUG修复linear_ramp填充负数时的无符号整型溢出问题#14275BUG允许在 Python 2 中对 Python 3 生成的 pickle 进行反序列化#14340BUG修复多处对.names与.fields的误用回迁#14423BUG测试并修复转换为 ctypes 的回归#14509BUG修复布尔类型 matmul 回归#14686BUG正确定义PyArray_DescrCheck#14853BLD构建脚本中为 shippable 增加apt update#14854BUG修复_ctypes类循环引用问题#13808#14856BUG修复np.einsum在 Power9 Linux 与 z/Linux 上的错误#14863BLD阻止-flto优化 long double 表示#14864BUG修复histogram处理有符号整数数组的问题#15172ENH回迁测试函数的改进#15191REL1.16.6 发布准备其中与科学计算日常使用相关性较高的几项值得展开说明pickle 跨版本兼容#14275修复了 Python 3 生成的 pickle 在 Python 2 下无法反序列化的问题。由于 1.16 系列同时支持 2.7 与 3.5–3.7跨版本数据交换场景下此项修复尤为实用einsum 在 Power9 / z 架构上的错误#14856np.einsum是基于下标记号的张量运算核心函数其实现入口可追溯至 numpy/_core/src/multiarray/multiarraymodule.c 中的einsum_sub_op_from_str第 2737 行等下标解析逻辑本修复针对特定 CPU 架构下的计算错误histogram 有符号整数修复#14864np.histogram的 Python 层实现在 numpy/lib/_histograms_impl.pyhistogram定义于第 686 行该修复保证对包含负值的有符号整数数组分箱时结果正确ctypes 转换回归#14423、#14854修复了数组转换为 ctypes 对象时的回归与循环引用问题影响ndarray.ctypes相关用法。升级与使用建议对于仍停留在 1.16 系列的存量用户升级到 1.16.6 时建议注意以下几点Python 版本边界本版本支持的 Python 为 2.7 与 3.5–3.7若运行环境高于 3.7应迁移到更高版本的 NumPy如 1.19 或 2.x 系列构建依赖从源码自行构建时请使用Cython 0.29.2链接 OpenBLAS 时需OpenBLAS v0.3.7以规避 Skylake 系列 CPU 上的错误布尔 matmul 行为若此前受 1.16.5 中布尔回归影响而做了规避处理升级后可移除相应 workaround恢复原布尔语义测试断言输出变化升级后assert_allclose等断言的失败信息会新增最大绝对/相对差值字段基于旧版错误信息文本做解析的自动化脚本可能需要适配。总之NumPy 1.16.6 作为 1.16 LTS 系列亦是支持 Python 2.7 的最后一个系列的收官之作通过 14 个 PR 完成了缺陷修复、构建修正与能力回迁尤其以 matmul 对象数组支持、布尔回归修复和测试断言差值报告三项变更最具实战价值。【免费下载链接】numpyThe fundamental package for scientific computing with Python.项目地址: https://gitcode.com/gh_mirrors/nu/numpy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门