
NumPy 1.10.2 发布说明深度解析relaxed stride 回滚、Fortran 视图弃用与关键缺陷修复【免费下载链接】numpyThe fundamental package for scientific computing with Python.项目地址: https://gitcode.com/gh_mirrors/nu/numpy本篇技术指南以 NumPy 1.10.2 官方 Release Notes 为主体系统梳理该维护版本在兼容性策略上的重大调整——relaxed stride checking 回滚为非默认、Fortran 连续数组视图相关行为变更与弃用以及 34 个已修复 issue 与 36 个合并 PR 的分类解读。文章同时结合当前仓库源码numpy.i、ndarraytypes.h、ma/core.py 等逐项验证修复原理。读完本文你将掌握1.10.x 时代 Fortran/C 连续性与视图语义的变迁脉络numpy.iSWIG 绑定中 Fortran 连续性宏的正确用法以及ma、random、lib等模块中若干历史缺陷的根因与修复方式。版本概览与支持范围NumPy 1.10.2 是针对 1.10.1 中暴露的一系列缺陷的维护性发布bugfix release。发布说明原文指出This release deals with a number of bugs that turned up in 1.10.1 and adds various build and release improvements.——即该版本一方面集中修复 1.10.1 引入的回归问题另一方面补充了大量构建build与发布release流程层面的改进。需要特别留意的是文档中有一处明显的笔误1.10.2 的说明文字写为 Numpy 1.10.1 supports Python 2.6 - 2.7 and 3.2 - 3.5.此处实际指代的是1.10.2 及其所在 1.10 系列支持的 Python 版本范围——Python 2.6/2.7 与 Python 3.2/3.5。读者在引用时应以 1.10 系列整体为准不要误解为仅 1.10.1 支持这些版本。兼容性说明Compatibility Notesstride 语义的收敛与回退1.10.2 的兼容性变化是本版本最具技术深度的部分全部围绕数组连续性contiguity与视图view语义展开核心关键词是 relaxed stride checking。Relaxed stride checking 不再是默认行为变更内容在 1.10 系列中relaxed stride checking 从默认开启被回退为默认关闭。技术背景relaxed stride checking 是 NumPy 对数组连续性判定规则的放宽——在严格模式下只有当数组的 stride 完全符合行优先C 顺序或列优先Fortran 顺序理论值时才被标记为对应连续而 relaxed 模式允许某些实际上可被当作连续处理的非标准 stride 布局也被认可。回退原因发布说明明确指出回退源于向后兼容性问题——There were back compatibility problems involving views changing the dtype of multidimensional Fortran arrays that need to be dealt with over a longer timeframe.即通过 view 修改多维 Fortran 数组的 dtype 时relaxed stride 检查会破坏既有代码的预期行为该问题需要更长时间来妥善处理因此在 1.10 中先回退为非默认。对应合并的 PR 为 gh-6735MAINT: Make no relaxed stride checking the default for 1.10并在 Merged PRs 一节中注明Relaxed stride checking was reverted. There were back compatibility problems involving views changing the dtype of multidimensional Fortran arrays...为什么 Fortran 视图与 relaxed stride 冲突从宏定义看根因要理解这次回退的技术根因可以对照当前仓库中连续性判定宏的定义。在 ndarraytypes.h 中#define PyArray_ISONESEGMENT(m) (PyArray_CHKFLAGS(m, NPY_ARRAY_C_CONTIGUOUS) || \ PyArray_CHKFLAGS(m, NPY_ARRAY_F_CONTIGUOUS)) #define PyArray_ISFORTRAN(m) (PyArray_CHKFLAGS(m, NPY_ARRAY_F_CONTIGUOUS) \ (!PyArray_CHKFLAGS(m, NPY_ARRAY_C_CONTIGUOUS)))关键语义在于PyArray_ISFORTRAN(m)判定为真的条件是Fortran 连续且同时非 C 连续。这意味着在传统语义中一个数组要么是 C 连续、要么是 Fortran 连续二者在ndim 1的非标量数组上被视为互斥关系。而一旦启用 relaxed stride checking同时满足 C 连续与 Fortran 连续的数组会被一律当作 C 连续处理这打破了二者互斥这一被大量既有代码依赖的隐含假设导致通过 view 修改多维 Fortran 数组 dtype 的代码出现行为偏差。这正是发布说明所描述的回退理由在宏层面的体现。弃用通过 dtype 赋值改变 Fortran 数组的 shape变更内容本版本引入一条新的弃用deprecation规则——禁止对非 C 连续non-C-contiguous数组的dtype属性赋新描述符descriptor如果该赋值会导致 shape 发生变化。用文档原话This effectively bars viewing a multidimensional Fortran array using a dtype that changes the element size along the first axis.即实际封堵了沿第一个轴改变元素大小的方式查看多维 Fortran 数组这一操作路径。弃用动机该弃用是为未来始终启用 relaxed stride checking铺路This deprecation prepares the way to always enable relaxed stride checking。因为在 relaxed 模式下同时 C/Fortran 连续的数组被统一视为 C 连续部分依赖二者互斥的代码会失效而通过 dtype 修改 shape 恰恰是这类代码的高发场景。对应的实现 PR 为 gh-6747DEP: Deprecate changing shape of non-C-contiguous array via descr而 gh-6678Getting unexpected error from: X.dtype complex则记录了用户在此场景下遇到的实际报错。numpy.i 中的 SWIG 绑定修复relaxed stride checking 的引入还暴露了一个 SWIG 绑定层面的真实 bugarray_is_fortran(a)宏此前错误地使用PyArray_ISFORTRAN来判定 Fortran 连续性而正确做法是使用PyArray_IS_F_CONTIGUOUS。在当前仓库 tools/swig/numpy.i 中可以同时看到新旧两种实现的分支%#if NPY_API_VERSION NPY_1_7_API_VERSION /* ... 旧版 API 分支 ... */ %#define array_is_fortran(a) (PyArray_ISFORTRAN((PyArrayObject*)a)) %#else /* ... NPY_1_7 及以后的新版 API 分支修复后的实现... */ %#define array_is_fortran(a) (PyArray_IS_F_CONTIGUOUS((PyArrayObject*)a)) %#endif结合上文宏定义可知PyArray_ISFORTRAN要求F 连续且非 C 连续因此在 relaxed stride 语义下一个同时 C/Fortran 连续的数组会被误判为不是 Fortran 连续进而导致make_fortran()等函数做出错误的复制决策。make_fortran函数的修复后逻辑位于 tools/swig/numpy.i若array_is_fortran(ary)为真则直接复用原数组指针is_new_object 0否则通过PyArray_FromArray以NPY_ARRAY_F_CONTIGUOUS旧版 API 为NPY_FORTRANORDER标志创建一个新的 Fortran 连续副本。这一判断的正确性直接取决于array_is_fortran宏的语义。对下游用户的实操建议发布说明明确建议You may want to regenerate swigged files using the updated numpy.i——即凡是使用 SWIG 封装 NumPy 数组的项目应使用更新后的 numpy.i 重新生成绑定代码否则在 1.10.2 的默认非 relaxed模式下Fortran 连续性判定可能仍然产生偏差。Issues Fixed按模块分类解读1.10.2 共修复 34 个 issue涉及核心数组语义、掩码数组、随机数、f2py、构建系统等多个领域。以下按模块分组解读代表性修复数组核心语义与视图dtype / view / stridegh-6678X.dtype complex或Y X.view(complex)报错——与上文 Fortran 视图弃用直接相关是触发弃用规则的用户可见场景。gh-6590 / gh-6771Fortran 数组在 1.10 中的问题np.rec.fromarrays在 1.9.2 与 1.10.1 之间丢失 dtype 元数据metadata由 gh-6780BUG: metadata is not copied to base_dtype修复。gh-6491 / gh-6572stride_tricks广播数组时报错对应修复 PR gh-6556BUG: Error in broadcast_arrays with as_strided array。gh-6575split产生维度数量错误的空数组gh-6576 将修复回退因为其修正了 1.11 才应有的行为而 1.9 已存在该行为。数学函数median / partition / interp / innergh-6462空数组求中位数抛出IndexError。当前实现位于 numpy/lib/_function_base_impl.pydef median对应修复 PR gh-6527BUG: Fix the IndexError when taking the median of an empty array。gh-6530partition函数对空输入报错由 gh-6553BUG: Fix partition and argpartition error for empty input修复。gh-6468numpy.interp在x[0]xp[0]时错误地使用left值。当前interp实现位于 numpy/lib/_function_base_impl.py其文档明确left仅用于x xp[0]的情形修复 PR 为 gh-6785BUG: Quick and dirty fix for interp。gh-6532numpy.inner在非连续数组上偶发返回错误精度结果由 gh-6546BUG: Fix inner product regression for non-contiguous arrays修复。掩码数组numpy.magh-6019结构化数组含多维列时掩码数组的repr失败对应修复 PR gh-6094BUG: Fixed a bug with string representation of masked structured arrays与 gh-6813TST,BUG: Make test_mvoid_multidim_print work for 32 bit systems。gh-6611ma.dot不再总是返回掩码数组1.10 回归由 gh-6653BUG: Fix ma dot to always return masked array修复。gh-6667ma.make_mask对ma.nomask输入处理不正确。当前实现位于 numpy/ma/core.py其 docstring 明确约定If the dtype is flexible ... This is ignored whenmisnomask, in which casenomaskis always returned.修复 PR 为 gh-6668BUG: ma.make_mask should always return nomask for nomask argument。nomask本身定义于 numpy/ma/core.pynomask MaskType(0)。gh-6537 / gh-6538ma.atleast_*对标量参数应返回数组、ma.masked_values按请求收缩掩码分别由 gh-6537、gh-6538 修复。记录数组recarraygh-6467记录数组访问出现性能回归由 gh-6208MAINT: Speedup field access by removing unneeded safety checks与 gh-6562BUG: Disable view safety checks in recarray缓解。gh-6497recarray 上的 reduce 操作失败gh-6500 修复recarray 视为子数组时不转换为 np.record 类型的问题。gh-6636numpy.recarray嵌套 dtype 内存泄漏由 gh-6642BUG: Fix memleak in _convert_from_dict修复。gh-6641按字段子集化 recarray 得到结构化数组由 gh-6643ENH: make recarray.getitem return a recarray改为返回 recarray。随机数模块numpy.randomgh-6602numpy.random.__all__缺失choice和dirichlet导致from numpy.random import *无法导入这两个函数。当前仓库 numpy/random/init.py 的__all__中已同时包含choice与dirichlet修复 PR 为 gh-6614BUG: Add choice and dirichlet to numpy.random.all。f2py 相关gh-6563f2py 的intent(out)在新版本中失效。gh-6718pip 安装的 numpy-1.10.1 在 virtualenv 中 f2py 测试失败由 gh-6756TST: only test f2py, not f2py2.7 etc修复。gh-6719Cython 文件编译报 Pythonic division not allowed without gil由 gh-6721 修复。另见 gh-6487f2py 数组定义中允许嵌套参数、gh-6488f2py 扩展 common block 而非覆盖。构建与发布流程gh-6495gfortran 无法识别命令行选项-ffpe-summary。gh-6569python setup.py build_ext -i后无法运行测试由 gh-6577 修复。gh-6675master 与 1.10 分支的优化 BLAS 检测失效由 gh-6717BUG: Readd fallback CBLAS detection on linux与 gh-6757BUG: link cblas library if cblas is detected修复。gh-6478OS X 构建的 Intel 编译器标志修复。gh-6481LIBPATH 含空格时 Python 2.7 与 Win32 平台的支持。gh-6807 / gh-6781Windows 与 Travis-CI 测试基础设施问题gh-6783 适配新 Google 基础设施。gh-6817禁用 32 位 msvc9 编译器的 npy_rint 优化配合 gh-6698 的np.rint大整数测试。Merged PRs 综述与三次关键回退1.10.2 共合并 36 个 PR含对 master 的 backportbackport 时同时列出原 PR 编号。除上述按 issue 对应的修复外还有若干流程性改进值得留意测试与质量gh-5773用 pytest 时隐藏测试辅助工具 traceback、gh-6686修复 assert_string_equal 的 bug、gh-6460以侵入性更小的方式替代 os.environ.clear、gh-6775补齐缺失的from __future__样板。发布工具gh-6474更新 Paver 脚本与测试警告自动切换、gh-6501 / gh-6558新增文档 make upload 命令、gh-6579修正 doc upload 规则。杂项gh-6697修复 PyArray_FROM_OT 宏定义中多余的冒号、gh-6526-OO 模式下 setup.py 中__doc__的使用。特别需要关注的是本版本的三次回退revert决策它们体现了维护团队在兼容性与新特性之间的权衡mingwpy 初始支持被回退gh-6536对应回退 gh-5614因对非 Windows 构建造成问题而撤销。np.lib.split的修复被回退gh-6576对应回退 gh-6376因该修复提前引入了 NumPy 1.11 才应有的行为而该行为在 1.9 已存在为避免 1.10.2 偏离既定语义而回退。relaxed stride checking 回退为非默认gh-6735即前文 Compatibility Notes 的核心变更同时配合 gh-6726BUG: Fix bugs exposed by relaxed stride rollback清理回退暴露的问题。附加说明1.10.1 的 RuntimeWarning/DeprecationWarning 回归发布说明末尾专门记录了一个 1.10.1 的回归该版本中的一个 bug 导致依赖 NumPy 的项目中RuntimeWarning和DeprecationWarning被当作异常抛出即警告升级为错误。此问题在 1.10.2 中已修复That has been fixed.。这一看似细小的修复对生态影响重大——若警告被强制升级为异常任何依赖 NumPy 的第三方库中触发已弃用 API 的代码都会直接崩溃而不是仅打印警告。对于从 1.10.1 升级的用户这是升级到 1.10.2 的最直接理由之一。总结与升级建议NumPy 1.10.2 作为一个维护版本其价值集中在三方面语义收敛将 relaxed stride checking 回退为非默认并弃用通过 dtype 赋值改变非 C 连续数组 shape的操作为后续版本彻底理清 Fortran/C 连续性与视图的关系铺路缺陷修复覆盖 ma、recarray、random、libmedian/partition/interp/inner、f2py 等多个模块的 34 个 issue其中多数为 1.10.1 引入的回归构建与发布改进修复 BLAS 检测、Intel/gfortran 编译器标志、Windows 与 CI 基础设施问题并完善文档发布工具链。对于仍在 1.10.x 系列的用户建议立即升级至 1.10.2一方面规避 1.10.1 中警告升级为异常的回归另一方面获得上述全部缺陷修复使用 SWIG 封装 NumPy 的项目则应基于更新后的 tools/swig/numpy.i 重新生成绑定文件确保 Fortran 连续性判定与 1.10.2 的语义一致。【免费下载链接】numpyThe fundamental package for scientific computing with Python.项目地址: https://gitcode.com/gh_mirrors/nu/numpy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考