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

NumPy 1.16.0 版本深度解析:`__array_function__` 协议落地、gufunc 签名扩展与核心架构重构

NumPy 1.16.0 版本深度解析__array_function__协议落地、gufunc 签名扩展与核心架构重构【免费下载链接】numpyThe fundamental package for scientific computing with Python.项目地址: https://gitcode.com/gh_mirrors/nu/numpy本文基于本仓库 doc/changelog/1.16.0-changelog.rst 编写。NumPy 1.16.0 是 2019 年初发布的一个重要版本它正式实现了 NEP 18__array_function__协议的核心机制为第三方数组库如 cupy、dask、xarray与 NumPy 函数的互操作铺平道路同时完成了 NEP 15multiarray 与 umath 模块合并这一大型内部架构重构并在 ufunc 系统、直方图、线性代数、输入输出等领域带来了一批新特性与行为变更。读完本文你将系统掌握该版本的全部主要特性、API 变更与迁移注意事项并能在源码层面定位对应实现。版本总览113 位贡献者、490 个合并 PR根据 1.16.0-changelog.rst本次发布共有113 位贡献者参与名字带者为首次贡献补丁的新人共合并了490 个 pull request规模在当时的 minor release 中相当可观。参与人员中既有 Allan Haldane、Sebastian Berg、Eric Wieser、Matti Picus、Ralf Gommers 等核心维护者也有大量来自学术界与工业界的首次贡献者。从 PR 类型看本次发布呈现出鲜明的新协议 架构重构 平台加固三大主线协议与设计NEPNEP 15模块合并、NEP 18__array_function__、NEP 19RNG 政策、NEP 20gufunc 签名部分接受、NEP 21高级索引、NEP 22鸭子数组总览相继在 1.16 开发周期内更新或被接受。内部重构MAINT/BLDmultiarray 与 umath 合并落地exec_command从构建系统中大规模移除测试框架向 pytest 参数化迁移CI 全面引入 Azure Pipelines。平台支持BUG/BLD新增 AArch32/ARMv8 支持修复 AIX、ppc64le、s390x、big-endian 等平台上的编译与运行时问题。下文按新协议 → 新特性 → 性能重构 → 平台支持 → 弃用与迁移五个维度展开。里程碑特性__array_function__协议NEP 18正式实现1.16.0 最受关注的变化是 NEP 18__array_function__从提案走向实现。该协议的目标是让numpy命名空间下的函数如np.concatenate、np.linalg.svd能够识别并调度到传入对象的自定义实现上从而让 cupy、dask、xarray 等第三方库的数组对象可以直接参与 NumPy 函数调用。从源码结构看该机制的核心实现位于 numpy/_core/overrides.py当时为numpy/core/overrides.py通过array_function_dispatch装饰器包装各个公开函数并在运行时收集输入对象上的__array_function__方法进行分派。本版本中相关 PR 覆盖了全命名空间#12005核心__array_function__机制的首版实现#12115为numpy.core大部分函数接入分派#12116、#12119为np.lib分两批接入#12117为np.fft与np.linalg接入#12163为np.einsum与np.block接入#12154为np.core.defchararray接入#12471为np.linspace等创建类函数接入#12212ndarray.__repr__不再依赖__array_function__避免打印时的循环调度。值得注意的细节是#12362为了稳妥起见1.16.0 通过环境变量开关默认关闭了该协议的调度__array_function__dispatch 仅在环境变量启用时生效社区留出时间让下游库逐步适配后再在后续版本默认开启。#12328还允许ndarray子类参与调度#12099为array_function_dispatch增加了对 dispatcher 函数的校验逻辑。对开发者的意义如果你维护的是自定义数组类可在类中实现__array_function__方法以接管 NumPy 函数的默认行为如果你只使用标准 NumPy该协议在 1.16 中基本是透明的默认关闭无需改动现有代码。新特性详解1.np.diff新增prepend/append参数PR#8206为np.diff增加了prepend与append参数允许在差分之前沿指定轴拼接值从而让输出长度与输入保持一致经典应用与np.cumsum互逆时对齐长度。当前实现位于 numpy/lib/_function_base_impl.py核心逻辑标量prepend/append会被广播为沿 axis 长度为 1、其余维度与输入一致的数组np.broadcast_to非标量输入要求除axis外形状与a匹配拼接后通过a[slice1] - a[slice2]循环执行n次差分布尔数组走not_equal路径保持布尔类型#11805补充了ediff1d的类型检查。仓库测试 numpy/lib/tests/test_function_base.py 中验证了prepend0后np.cumsum(np.diff(x, prepend0)) x这一恒等关系以及沿axis0/1广播的正确性。import numpy as np x np.array([1, 2, 4, 7, 0]) np.diff(x, prepend0) # array([1, 1, 2, 3, -7]) np.diff(x, append0) # array([1, 2, 3, -7, -0])末位为 0 - 7 np.diff(x, n2, prepend0) # 高阶差分同样支持2.np.histogram新增 Stone 最优 bin 数估计器PR#8923为np.histogram/np.histogram_bin_edges的bins字符串选择器新增了stone它通过最小化估计积分平方误差ISE的交叉验证方式选取 bin 宽度可视为 Scott 规则的推广尤其适合分布形态偏离正态的数据。当前实现位于 numpy/lib/_histograms_impl.py_hist_bin_stone在[1, max(100, int(sqrt(n)))]范围内搜索使代价函数(2 - (n1) * p_k·p_k) / hh最小的 bin 数若命中搜索上界会发出RuntimeWarning提示bin 数估计可能次优。它被注册在_hist_bin_selectors字典中见 numpy/lib/_histograms_impl.py与auto、fd、doane、scott、rice、sturges、sqrt并列。import numpy as np rng np.random.default_rng(42) data rng.normal(size1000) counts, edges np.histogram(data, binsstone)3.np.histogramdd新增density参数PR#11531为np.histogramdd增加了与np.histogram对齐的density参数取代语义含糊的normed。配套的#11373用测试展示了histogramdd的normed即histogram的density这一等价关系帮助用户迁移。4.ufunc.identity支持任意 Python 对象PR#8955放宽了ufunc.identity的类型限制此前只能是数值或None现在可以是任意 Python 对象如字符串、元组为自定义 ufunc 在reduce场景下使用非数值单位元提供支持。这是 ufunc 元数据系统的一次明显松绑相关讨论与实现细节见 numpy/_core/umath.py 中 ufunc 对象的文档与实现。5. gufunc 签名扩展frozen 与 flexible 维度PR#11175、#11297、#11429实现了 NEP 20 的部分内容广义 ufuncgufunc签名支持 frozen如(m,)-(), 固定m与 flexible 维度但不包含 broadcastable 维度。#11950又从#11175中提取了无关的辅助改进单独合入。这使np.linalg中(n,k),(k,m)-(n,m)这类带具体维度约束的运算可以用统一机制表达#12219将matmul转为 ufunc 即受益于此。6.np.matmul成为真正的 ufuncPR#12219将matmul实现为 ufunc使其具备广播、out参数、__array_ufunc__分派等 ufunc 能力#12488相应地在NDArrayOperatorsMixin上实现了matmul。从 numpy/_core/umath.py 的__all__列表中可以看到matmul已与add、multiply等并列在 ufunc 导出之列。#12494同时修复了 stride 为 0 的向量数组在matmul/dot中的边界问题。7.np.linspace/np.logspace/np.geomspace支持数组起止点PR#12388允许start与stop传入数组返回值将带上对应的广播形状。这极大简化了批量生成多组等差/等比序列的写法import numpy as np # 为 3 个起点同时生成 5 个点的等差序列 np.linspace(np.array([0, 10, 20]), np.array([1, 2, 3]), num5) # shape: (5, 3)8.np.loadtxt新增max_rows加载类函数全面支持pathlib.PathPR#11962为np.loadtxt增加了max_rows参数限制最多读取的行数对超大文本文件的抽样预览非常实用。同时PR#11348让加载类函数load、loadtxt、savetxt、fromfile、fromregex等接受pathlib.Path对象——从当前 numpy/lib/_npyio_impl.py 中大量isinstance(fname, os.PathLike)与os.fspath调用可以确认该能力的延续#12157还通过反向移植支持了第三方 path-like 对象。9.ctypes互操作增强Union、_pack_、大小端#12405支持np.dtype(ctypes.Union)#12342修复np.dtype(ctypes.Structure)不尊重_pack_的问题#12380修复np.dtype(ctype)不尊重字节序的问题#12417修复np.dtype(ctypes.c_void_p)的回归#12112getfield参数校验防止非法内存访问。对应说明收录在#12392的发布说明补充中涉及 numpy/ctypeslib/_ctypeslib.py 与 numpy/_core/_dtype_ctypes.py 的 dtype 构造逻辑。10. 结构化数组与 recfunctions多字段赋值辅助PR#11526在 numpy/lib/recfunctions.py 中新增多字段赋值辅助函数#12447重新引入多字段 copy→view 的变更配合#12408MaskedArray 多字段视图的fill_value修复与#12563结构化数组文档更新结构化数据操作在该版本中变得更完整。11. 时间与随机模块#12120timedelta64支持模运算%#118400 维数组的 Pythontimedelta可正确转换为np.timedelta64#11852np.timedelta64接受 NumPy 整数#11694修复datetime64/timedelta64标量的 pickle 与 memoryview#11383np.random.choice允许size0#11613np.random.geometric在p0时抛出ValueError而非未定义行为#12372修复np.random.weibull对a0的处理#11527文档注明method为 Box-Muller 极坐标形式。性能优化与内部重构NEP 15 落地multiarray 与 umath 合并#10704提案、#10915实现、#11559接受、#12377转 final完成了将numpy.core.multiarray与numpy.core.umath两个 C 扩展合并为一个_multiarray_umath模块的长期重构。这一合并减少了模块间往返调用简化了 ufunc 与 ndarray 内部代码的共享例如 ufunc override 代码在#11480中被集中到 umath/multiarray 内部。副作用是旧版编译的第三方扩展可能需要重新编译——#11880明确修复了合并破坏旧 wheel的兼容问题。热路径优化#11351提升 ufunc 关键字参数解析速度配#11453的解析 benchmark#11518normalize_axis_tuple提速约 30%#11717einsum的optimize参数默认值改为False原先自动启用贪心优化用户可按需显式传入optimizeTrue#11941保证einsum(optimizeTrue)对tensordot的分派具有确定性#11957大内存分配支持使用 huge pages#11971、#11991np.block重构为单次拷贝算法并避免递归闭包配#11965的 3D 场景 benchmark。构建系统清理大量 PR 将exec_command从build_ext、ccompiler.py、system_info.py、f2py 初始化等构建路径中移除#11891、#11898-#11901、#11935、#11937改用更安全的子进程调用方式#11525将*FLAGS由覆盖改为追加#11562同步更新发布说明#11566修复了gcc 实为 clang时误用 gcc 警告标志的问题#11470保证runtests.py被中断时不会遗留构建任务。平台与构建支持1.16.0 大幅扩展了架构支持面并修复了平台特定问题#11016新增AArch3232 位 ARM支持#11568改进 aarch64 CPU 检测与打印#11906在 CI 中加入 ARMv8#11725修复 aarch64 与 s390x 上的 Fortran kind 检测#11711修复 big-endian 系统未定义函数#11727修复 ppc64le 上 longdouble 打印#12707将 sparc 加入实现 16 字节 reals 的平台列表#11479修复 ppc64/ppc64le 的#define#12439修复 gcc 下NPY_VISIBILITY_HIDDEN变为NPY_NO_EXPORT的问题#12407构建失败时回退到 ascii locale#12420AIX 下 gfortran 需要-lpthread与-maix64#12124重构浮点错误状态以支持 Alpine Linux#12051、#12081、#12082、#12306、#12466CI 矩阵扩展至 macOS/Windows/Python 3.5/32 位 Linux并改用 OpenBLAS 跑 Windows CI。弃用与行为变更迁移必读正式弃用的 API弃用项PR替代方案np.histogram/np.histogramdd的normed参数#11323、#11428修正弃用逻辑#11323使用densitynp.asscalar#12123arr[()]或item()np.set_numeric_ops及同类函数#11916无官方替代移除后将以异常形式暴露向 stack 类函数np.stack等传入 generator#12280先转为 list/array未文档化、未使用的 dtype type 字典#11382使用np.sctypeDict等公开映射unravel_index的旧式位置参数用法#10797显式使用shape关键字行为变更np.einsum优化默认关闭#11717需要性能时显式传optimizeTrue。所有与NaT的比较结果均为 False#11948NaT anything、NaT NaT等全部为 False与 NaN 的浮点语义对齐。minimum/maximum对 NaN 不再告警#12236此前对含 NaN 的输入发出告警的行为被移除#11595曾临时补充标量/float16 告警最终回归静默语义。np.array([[1], 2])与np.array([1, [2]])行为统一#11601。ndarray.__pos__正确实现#11450一元正号不再走__array_wrap__的异常路径。fromstring/frombuffer后不允许设置 writable 标志#11739。空数组的 SVD、QR、lstsq 支持#11424、#11593、#11594线性代数在空矩阵上不再崩溃。np.load空.npz文件修复#11522memmap文件句柄管理修复#10551。f2py脚本改为 entry_points 安装#11802并从 PATH 感知切换为优先使用同版本 Python 的 cython#11514。兼容性提醒由于multiarray/umath 合并NEP 15基于 C API 的第三方扩展需要针对 1.16 重新编译numpy.core.multiarray的 Python 层包装函数在#12470中被移除。__array_function__在 1.16 中默认关闭环境变量控制请勿在此时依赖其默认行为相关文档见#12148的发布说明。Python 2.7 仍受支持但已开始收紧#11866移除 Python 3.4 测试#11850添加Python 2 支持移除后需清理的注释Python 3.7 加入 CI#11598、#11434增加 PyPI classifier。文档与工程质量#11084在 README 中链接测试指南 doc/TESTS.rst#11865新增 Code of Conduct 文档#11567、#11610集成 codecov并引入 C 源码行覆盖率大量 docstring 修订einsum#11234、meshgrid绘图示例#11626、broadcast_arrays示例修正#11335、polynomial.Polynomial推荐替代np.polyfit#11733、np.ndim推荐替代np.isscalar#11882等#11282将比较运算符的特殊处理移出 ufunc 主路径#11904、#11894、#11895等将核心/ f2py / linalg 测试参数化迁移至 pytest。结语NumPy 1.16.0 是一个承上启下的版本在功能层面它交付了__array_function__协议的初版实现、gufunc 签名扩展与matmulufunc 化为后续 1.17 中该协议默认启用、以及现代 NumPy 的 duck array 生态奠定了基础在工程质量层面multiarray/umath 合并与构建系统清理为 2.0 时代的大型重构扫清了障碍。对于升级用户重点核对弃用与行为变更一节中的normed→density、einsum优化默认值、NaT 比较语义以及第三方扩展重新编译这四点即可平稳过渡到 1.16 及之后的版本线。【免费下载链接】numpyThe fundamental package for scientific computing with Python.项目地址: https://gitcode.com/gh_mirrors/nu/numpy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

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

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