NumPy-1-26-中文文档-二十八-

NumPy 1.26 中文文档(二十八)

原文:numpy.org/doc/

NumPy 1.14.6 版本说明

原文:numpy.org/doc/1.26/release/1.14.6-notes.html

这是对 1.14.5 版本之后报告的 bug 的修复版本。最重要的修复包括:

  • 修复了ma.masked_values(shrink=True)中的行为更改

  • 修复了新的缓存分配机制,使其线程安全。

在这个版本中支持的 Python 版本为 2.7 和 3.4 - 3.7。PyPI 上的 Python 3.6 版本应与所有 Python 3.6 版本兼容。

贡献者

总共有 4 人为这个版本做出了贡献。名字中有“+”号的人第一次贡献了代码。

  • Charles Harris

  • Eric Wieser

  • Julian Taylor

  • Matti Picus

合并的拉取请求

总共有 4 个拉取请求合并到了这个版本中。

  • #11985:BUG:修复没有全局解释器锁时的缓存分配

  • #11986:BUG:撤销 ma.masked_values(shrink=True) 的行为更改

  • #11987:BUG:修复 PyArray_AdaptFlexibleDType 中的引用计数泄漏

  • #11995:TST:为 NumPy 1.14 添加 Python 3.7 测试

贡献者

总共有 4 人为这个版本做出了贡献。名字中有“+”号的人第一次贡献了代码。

  • Charles Harris

  • Eric Wieser

  • Julian Taylor

  • Matti Picus

合并的拉取请求

总共有 4 个拉取请求合并到了这个版本中。

  • #11985:BUG:修复没有全局解释器锁时的缓存分配

  • #11986:BUG:撤销 ma.masked_values(shrink=True) 的行为更改

  • #11987:BUG:修复 PyArray_AdaptFlexibleDType 中的引用计数泄漏

  • #11995:TST:为 NumPy 1.14 添加 Python 3.7 测试

NumPy 1.14.5 版本发布说明

原文:numpy.org/doc/1.26/release/1.14.5-notes.html

这是 1.14.4 版本发布后报告的错误的修复版本。其中最重要的修复包括:

  • 修复了在 alpine 和 NetBSD 上的编译错误

本版本支持的 Python 版本是 2.7 和 3.4-3.6。PIP 中可用的 Python 3.6 版本是使用 Python 3.6.2 构建的,应与所有以前的 Python 3.6 版本兼容。源代码版本使用 Cython 0.28.2 进行了 Cython 化,并且应该适用于即将发布的 Python 3.7。

贡献者

共有 1 人为此版本做出了贡献。名字后有“+”的人第一次贡献了修补程序。

  • Charles Harris

拉取请求已合并

总共有 2 个拉取请求被合并到这个版本中。

  • #11274:BUG:正确使用 NPY_UNUSED。

  • #11294:BUG:删除额外的括号。

贡献者

共有 1 人为此版本做出了贡献。名字后有“+”的人第一次贡献了修补程序。

  • Charles Harris

拉取请求已合并

总共有 2 个拉取请求被合并到这个版本中。

  • #11274:BUG:正确使用 NPY_UNUSED。

  • #11294:BUG:删除额外的括号。

NumPy 1.14.4 发布说明

原文:numpy.org/doc/1.26/release/1.14.4-notes.html

这是 1.14.3 版本后报告的 bug 修复版本。最重要的修复有:

  • 修复了编译器指令重排序导致 NaN 在 np.maxnp.min 中未能正确传播的问题,

  • 修复了 SPARC 和旧 ARM 设备上的总线错误。

PPC 平台上长双精度浮点数的打印也有所改进。在该平台上仍然不完美,空白填充仍然不正确,并且将在 numpy 1.15 中修复,因此 NumPy 仍然无法通过 ppc 系统上的某些打印相关(和其他)单元测试。但是,打印的值现在是正确的。

注意,如果 NumPy 检测到不正确的 float32 dot 结果,将在导入时报错。在 Mac 上使用 Anaconda 环境时发现了这个问题,这是 MKL 和 PyQt5 之间微妙交互的结果。这并不严格是 NumPy 的问题,但最好让用户意识到这一点。有关更多信息,请参见 gh-8577 NumPy 问题。

该版本支持的 Python 版本是 2.7 和 3.4 - 3.6。来自 PIP 的 Python 3.6 wheels 是使用 Python 3.6.2 构建的,并且应该与所有先前版本的 Python 3.6 兼容。源代码版本是使用 Cython 0.28.2 进行了 cythonized 处理,并且应该适用于即将到来的 Python 3.7。

贡献者

总共有 7 人贡献了这个版本。带有“+”标记的人第一次贡献了补丁。

  • Allan Haldane

  • Charles Harris

  • Marten van Kerkwijk

  • Matti Picus

  • Pauli Virtanen

  • Ryan Soklaski +

  • Sebastian Berg

合并的拉取请求

共合并了 11 个拉取请求。

  • #11104:BUG:ppc64 上 DOUBLE_DOUBLE 格式的 str 错误

  • #11170:TST:linalg:为 gh-8577 添加回归测试

  • #11174:MAINT:添加导入时运行的健全性检查

  • #11181:BUG:void dtype 设置检查的偏移与实际指针对齐不正确

  • #11194:BUG:Python2 中的双精度数在交互式 shell 中无法正确打印。

  • #11198:BUG:优化编译器会重新排序调用 npy_get_floatstatus

  • #11199:BUG:SSE 内部循环中只有 reduce 警告

  • #11203:BUG:genfromtxt 中的字节分隔符/注释应该解码

  • #11211:BUG:修复更好测试暴露的引用计数/内存泄漏

  • #11219:BUG:在 optimize=True 时修复了 einsum 广播错误

  • #11251:DOC:记录 1.14.4 版本发布。

贡献者

一共有 7 人为这个版本做出了贡献。在他们名字旁边带有“+”的人第一次贡献了一次补丁。

  • Allan Haldane

  • Charles Harris

  • Marten van Kerkwijk

  • Matti Picus

  • Pauli Virtanen

  • Ryan Soklaski +

  • Sebastian Berg

合并的拉取请求

一共有 11 个拉取请求被合并到这个版本中。

  • #11104: BUG:ppc64 上的 DOUBLE_DOUBLE 格式的 str 错误

  • #11170: TST:linalg:为 gh-8577 添加回归测试

  • #11174: MAINT:添加在导入时运行的健全性检查

  • #11181: BUG:void 数据类型设置检查偏移量是否与实际指针对齐

  • #11194: BUG:Python2 中的双精度浮点数在交互式 shell 中打印不正确。

  • #11198: BUG:优化编译器可以重新排序对 npy_get_floatstatus 的调用

  • #11199: BUG:仅当在 SSE 循环内部时,reduce 使用 SSE 时会发出警告

  • #11203: BUG:genfromtxt 中的字节分隔符/注释应该被解码

  • #11211: BUG:修复由更好的测试暴露的引用计数/内存泄漏

  • #11219: BUG:修复了在 optimize=True 时 einsum 广播错误

  • #11251: DOC:记录 1.14.4 版本。

NumPy 1.14.3 发布说明

原文:numpy.org/doc/1.26/release/1.14.3-notes.html

这是对 1.14.2 版本后报告的一些错误的修复版本:

  • np.lib.recfunctions.fromrecords现在接受列表的列表,直到 1.15 版本

  • Python2中,浮点类型在打印到文件时使用新的打印样式

  • 在“旧版”打印模式中,“style”参数现在适用于 0 维数组

这个版本中支持的Python版本是 2.7 和 3.4-3.6。PIP提供的Python 3.6的安装包是使用Python 3.6.2构建的,应该兼容所有之前的Python 3.6版本。源代码发布经过了Cython 0.28.2的处理。

贡献者

共有 6 人为这次发布做出了贡献。名字后带“+”符号的人第一次为补丁做出了贡献。

  • 艾伦·哈尔代恩

  • 查尔斯·哈里斯

  • 乔纳森·马奇+

  • 马尔科姆·史密斯+

  • 马蒂·皮克斯

  • 保利·维尔坦恩

合并的拉取请求

共有 8 个拉取请求合并到这次发布中。

  • #10862: BUG: 浮点类型应该覆盖tp_print(1.14 版本回归)

  • #10905: BUG: 为了 1.14 版本的兼容性,fromrecords可以接受列表的列表

  • #10947: BUG: 在旧版模式中array2string函数中的‘style’参数失效(1.14…)

  • #10959: BUG: 测试,修复丢失的flags[‘WRITEBACKIFCOPY’]

  • #10960: BUG: 在check_embedded_lapack原型中添加缺失的下划线

  • #10961: BUG: 修复ma/bench.py中的编码回归(问题 10868)

  • #10962: BUG: 核心:修复pypy上的NPY_TITLE_KEY

  • #10974: BUG: 测试,修复PyArray_DiscardWritebackIfCopy

贡献者

共有 6 人为这次发布做出了贡献。名字后带“+”符号的人第一次为补丁做出了贡献。

  • 艾伦·哈尔代恩

  • 查尔斯·哈里斯

  • 乔纳森·马奇+

  • 马尔科姆·史密斯+

  • 马蒂·皮克斯

  • 保利·维尔坦恩

合并的拉取请求

共有 8 个拉取请求合并到这次发布中。

  • #10862: BUG: 浮点类型应该覆盖tp_print(1.14 版本回归)

  • #10905: BUG: 为了 1.14 版本的兼容性,fromrecords可以接受列表的列表

  • #10947: BUG: 在旧版模式中array2string函数中的‘style’参数失效(1.14…)

  • #10959: BUG: 测试,修复丢失的flags[‘WRITEBACKIFCOPY’]

  • #10960: BUG: 在check_embedded_lapack中添加缺失的下划线

  • #10961: BUG: 修复ma/bench.py中的编码回归(问题 10868)

  • #10962: BUG: 核心:修复pypy上的NPY_TITLE_KEY

  • #10974: BUG:测试,修复 PyArray_DiscardWritebackIfCopy…

NumPy 1.14.2 发布说明

原文:numpy.org/doc/1.26/release/1.14.2-notes.html

这是 1.14.1 版本后报告的一些 bug 的修复版本。主要解决的问题如下。

  • 新数组打印功能中的残留错误。

  • 导致共享库出现重定位问题的回归。

  • 改进了与 PyPy 的兼容性。

本版本支持的 Python 版本为 2.7 和 3.4 - 3.6。PIP 提供的 Python 3.6 wheels 是使用 Python 3.6.2 构建的,应该与所有先前版本的 Python 3.6 兼容。源代码发布的 cythonized 版本使用的是 Cython 0.26.1,已知支持即将发布的 Python 3.7 版本。希望运行 Python 3.7 的人应该查看 NumPy 存储库,并尝试使用尚未发布的 Cython 主分支进行构建。

贡献者

本次发布共有 4 位贡献者。有名字后带 “+” 符号的人首次贡献了一个补丁。

  • Allan Haldane

  • Charles Harris

  • Eric Wieser

  • Pauli Virtanen

合并的拉取请求

本版本共合并了 5 个拉取请求。

  • #10674:BUG:子类化数组 repr 的进一步向后兼容修复

  • #10725:BUG:dragon4 分数输出模式添加了太多的尾随零

  • #10726:BUG:修复 f2py 生成的代码在 PyPy 上的工作

  • #10727:BUG:修复 npy_longdouble_to_PyLong 上缺少的 NPY_VISIBILITY_HIDDEN

  • #10729:文档:创建 1.14.2 版本的说明和更改日志。

贡献者

本次发布共有 4 位贡献者。有名字后带 “+” 符号的人首次贡献了一个补丁。

  • Allan Haldane

  • Charles Harris

  • Eric Wieser

  • Pauli Virtanen

合并的拉取请求

本版本共合并了 5 个拉取请求。

  • #10674:BUG:子类化数组 repr 的进一步向后兼容修复

  • #10725:BUG:dragon4 分数输出模式添加了太多的尾随零

  • #10726:BUG:修复 f2py 生成的代码在 PyPy 上的工作

  • #10727:BUG:修复 npy_longdouble_to_PyLong 上缺少的 NPY_VISIBILITY_HIDDEN

  • #10729:文档:创建 1.14.2 版本的说明和更改日志。

NumPy 1.14.1 发布说明

numpy.org/doc/1.26/release/1.14.1-notes.html

这是对 1.14.0 版本发布后报告的一些问题的修复版本。主要解决的问题如下。

  • 对新的数组打印存在问题,尤其是复数值的打印,如果有任何其他问题,请报告。

  • 由于新的 optimized=True 默认值导致的 np.einsum 问题。已经应用了一些优化修复,optimize=False 现在是默认值。

  • np.unique中当axis=<一些数字>时的排序顺序现在将始终是子数组元素的词典顺序。在以前的 NumPy 版本中,存在一种优化,可能会导致对子数组进行排序为无符号字节字符串。

  • 1.14.0 中对结构化数组的多字段索引返回视图而不是副本的更改已被撤销,但仍然遵循 NumPy 1.15 的轨道。受影响的用户应阅读 1.14.1 Numpy 用户指南中“基础/结构化数组/访问多个字段”部分,以获取有关如何管理此转换的建议。

此版本支持的 Python 版本为 2.7 和 3.4 - 3.6。PIP 提供的 Python 3.6 版本是基于 Python 3.6.2 构建的,并且应与所有之前的 Python 3.6 版本兼容。源代码发布使用了 Cython 0.26.1 进行了 Cython 化,该版本已知不支持即将发布的 Python 3.7 版本。希望运行 Python 3.7 的用户应该查看 NumPy 回购,并尝试使用尚未发布的 Cython 主分支进行构建。

贡献者

总共有 14 人为此版本做出了贡献。名字后带有“+”的人是首次为此贡献了补丁的人。

  • Allan Haldane

  • Charles Harris

  • Daniel Smith

  • Dennis Weyland +

  • Eric Larson

  • Eric Wieser

  • Jarrod Millman

  • Kenichi Maehashi +

  • Marten van Kerkwijk

  • Mathieu Lamarre

  • Sebastian Berg

  • Simon Conseil

  • Simon Gibbons

  • xoviat

合并的拉取请求

本次版本合并了 36 个拉取请求。

  • #10339: BUG:限制对 win32 的 config 修改

  • #10368: 维护:在 linalg.norm 中调整类型提升

  • #10375: BUG:修复没有括号并去掉 repr 的字段…

  • #10395: 维护:更新 setup.py 中的下载 URL。

  • #10396: BUG:修复了 einsum 在 unicode 输入和 py2 中的问题

  • #10397: BUG:修复在 einsum 中错误的格式化错误消息

  • #10398: DOC:添加有关如何处理新数组打印的文档

  • #10403: BUG:将 einsum optimize 参数默认值设置为False

  • #10424: 增强:修复 np.record 对象的 repr 与 np.void 类型匹配 #10412

  • #10425: MAINT: 更新 i386 测试的 zesty 到 artful

  • #10431: REL: 添加 1.14.1 版本发布说明模板

  • #10435: MAINT: 在查找中使用 ValueError 处理重复字段名(回归)

  • #10534: BUG: 为无序字段提供更好的错误消息

  • #10536: BUG: 调整 genfromtxt 中的 bytes 列大小(#10401 的回归)

  • #10537: BUG: multifield-indexing 增加填充字节:回退到 1.14.1

  • #10539: BUG: 修复 python 2.7.5 中的 np.save 问题

  • #10540: BUG: 在 Py2 int()转换中添加缺少的 DECREF

  • #10541: TST: 添加 circleci 文档测试到 maintenance/1.14.x

  • #10542: BUG: 复数 repr 有额外空格,缺少+(1.14 回归)

  • #10550: BUG: 分配内存后未设置缺失的异常

  • #10557: BUG: 在 numpy.i 中,如果封装缓冲区不是 C_CONTIGUOUS,清除 CARRAY 标志。

  • #10558: DEP: 当检测到格式错误的记录时,发出 FutureWarning。

  • #10559: BUG: 修复 einsum 优化逻辑对单例维度的问题

  • #10560: BUG: 修复以位置顺序输出参数调用 ufuncs 的问题。

  • #10561: BUG: 修复不同 Big-Endian 测试失败(ppc64)

  • #10562: BUG: 使 dtype.descr 对于无序字段报错。

  • #10563: BUG: union1d中数组未被扁平化

  • #10607: MAINT: 更新 sphinxext 子模块哈希值。

  • #10608: BUG: 撤销 np.unique 中的排序优化。

  • #10609: BUG: 0d 子类的 str 中出现无限递归

  • #10610: BUG: 使类型定义与生成的 lapack 对齐

  • #10612: BUG/ENH: 改进非空类型结构化输出

  • #10622: BUG: 在 arrayprint.py 中处理递归闭包的释放(1.14 回归)

  • #10624: BUG: 正确识别逗号分隔的 dtype 字符串

  • #10629: BUG: 在 arrayprint.py 中处理递归闭包的释放(回归……)

  • #10630: REL: 为 1.14.1 版本做准备。

贡献者

总共有 14 人贡献了这个版本。名字后带“+”符号的人第一次贡献了一个补丁。

  • Allan Haldane

  • Charles Harris

  • Daniel Smith

  • Dennis Weyland +

  • Eric Larson

  • Eric Wieser

  • Jarrod Millman

  • Kenichi Maehashi +

  • Marten van Kerkwijk

  • Mathieu Lamarre

  • Sebastian Berg

  • Simon Conseil

  • Simon Gibbons

  • xoviat

合并的拉取请求

本次发布共合并了 36 个拉取请求。

  • #10339: BUG: 限制 config 修改为 win32。

  • #10368: MAINT: 调整 linalg.norm 中的类型提升。

  • #10375: BUG: 添加缺少的括号并从字段 less 的 repr 中删除引号……

  • #10395: MAINT: 更新 setup.py 中的下载 URL。

  • #10396: BUG: 修复 einsum 中与 unicode 输入和 py2 有关的问题。

  • #10397: BUG: 修复 einsum 中错误消息未格式化的问题。

  • #10398: DOC: 添加关于如何处理新数组打印的文档。

  • #10403: BUG: 将 einsum 优化参数默认设置为 False

  • #10424: ENH: 修复 np.record 对象的 repr 以匹配 np.void 类型 #10412。

  • #10425: MAINT: 将 i386 测试中的 zesty 更新为 artful。

  • #10431: REL: 添加 1.14.1 发行说明模板。

  • #10435: MAINT: 在查找中使用 ValueError 处理重复字段名称(回溯)。

  • #10534: BUG: 为无序字段提供更好的错误消息。

  • #10536: BUG: 在 genfromtxt 中调整字节列的大小(#10401 的回溯)。

  • #10537: BUG: multifield-indexing 添加填充字节:1.14.1 版本恢复。

  • #10539: BUG: 修复 np.save 在 python 2.7.5 中的问题。

  • #10540: BUG: 在 Py2 int() 转换中添加丢失的 DECREF。

  • #10541: TST: 将 circleci 文档测试添加到 maintenance/1.14.x 中。

  • #10542: BUG: 复数 repr 中有额外的空格,缺少 +(1.14 回溯)。

  • #10550: BUG: 分配内存后设置丢失的异常。

  • #10557: BUG: 在 numpy.i 中,如果包装的缓冲区不是 C_CONTIGUOUS,则清除 CARRAY 标志。

  • #10558: DEP: 当检测到异常记录时,发出 FutureWarning。

  • #10559: BUG: 修复对单例维度进行 einsum 优化的逻辑。

  • #10560: BUG: 修复使用位置输出参数调用 ufuncs 的问题。

  • #10561: BUG: 修复各种大端测试失败(ppc64)。

  • #10562: BUG:对于无序字段,使 dtype.descr 报错。

  • #10563: BUG:union1d中的数组未被展平

  • #10607: MAINT:更新 sphinxext 子模块哈希值。

  • #10608: BUG:撤销 np.unique 中的排序优化。

  • #10609: BUG:0d 子类的 str 中存在无限递归

  • #10610: BUG:使类型定义与生成的 lapack 对齐

  • #10612: BUG/ENH:改进非空类型的结构化输出

  • #10622: BUG:在 arrayprint.py 中释放递归闭包(1.14 回溯)

  • #10624: BUG:正确识别逗号分隔的 dtype 字符串

  • #10629: BUG:在 arrayprint.py 中释放递归闭包(回溯…)

  • #10630: REL:准备 1.14.1 版本发布。

NumPy 1.14.0 发布说明

原文:numpy.org/doc/1.26/release/1.14.0-notes.html

Numpy 1.14.0 是七个月工作的成果,包含大量的错误修复和新特性,以及几个可能引起兼容性问题的更改。用户将注意到的重大变化是 numpy 数组和标量打印方式的风格变化,这会影响到 doctest。详情请见下文,了解在必要时如何保留旧的打印样式。

影响未来发展的重大决定涉及 2020 年前撤销对 Python 2.7 支持的时间表。决定是在 2018 年的所有发布中支持 2.7,最后一个发布被指定为长期发布,并支持 2019 年的错误修复。在 2019 年,对 2.7 的支持将在所有新的发布中中止。有关更多细节,请参见NEP 12

该版本支持 Python 2.7 和 3.4-3.6。

亮点

  • np.einsum函数在可能时使用 BLAS

  • genfromtxtloadtxtfromregexsavetxt现在可以处理任意 Python 支持的编码的文件。

  • 对 NumPy 数组和标量的打印进行了重大改进。

新功能

  • parametrize: 添加到 numpy.testing 中的装饰器

  • chebinterpolate:在切比雪夫点上对函数进行插值。

  • format_float_positionalformat_float_scientific:以适当的四舍五入和填充控制方式格式化浮点标量。

  • PyArray_ResolveWritebackIfCopyPyArray_SetWritebackIfCopyBase,新的 C-API 函数,在实现 PyPy 兼容性方面非常有用。

弃用

  • 弃用使用np.bool_对象代替整数。先前,operator.index(np.bool_)是合法的,并允许像[1, 2, 3][np.True_]这样的构造。这是误导性的,因为它与np.array([1, 2, 3])[np.True_]表现不同。

  • 已弃用为空数组的真实测试。要检查数组是否非空,请使用array.size > 0

  • 使用minlength=None调用np.bincount已被弃用。 应该使用minlength=0

  • 使用np.fromstring调用默认值为sep参数已被弃用。当未提供该参数时,使用了一个破碎的np.frombuffer的版本,它默默地接受 unicode 字符串,并且在将它们编码为 utf-8(python 3)或默认编码(python 2)后,将它们视为二进制数据。如果需要读取二进制数据,应直接使用np.frombuffer

  • 在非遗留打印模式中,array2stringstyle选项已被弃用。

  • PyArray_SetUpdateIfCopyBase已被弃用。对于 NumPy 版本 >= 1.14,请改用PyArray_SetWritebackIfCopyBase,有关更多细节,请参见下面的C API 变更

  • 已弃用使用UPDATEIFCOPY数组,有关细节,请参见下文的C API 变更。我们不会停止对这些数组的支持,但它们与 PyPy 不兼容。

未来的更改

  • np.issubdtype将停止向下转换 dtype-like 参数。可能认为issubdtype(np.float32, 'float64')issubdtype(np.float32, np.float64)意思相同 - 然而,以前有一个未记录的特别情况,将前者转换为issubdtype(np.float32, np.floating),给出令人惊讶的结果为 True。

    这个翻译现在给出了一个解释正在发生的翻译的警告。在将来,将禁用翻译,并且第一个例子将与第二个例子等效。

  • np.linalg.lstsqrcond默认值将被更改。np.linalg.lstsqrcond参数将把其默认值更改为输入数组维度的机器精度乘以最大值。当rcond未被明确传递时,将发出FutureWarning

  • a是不连续时,a.flat.__array__()将返回a的可写副本。以前当a可写时,它返回一个 UPDATEIFCOPY 数组。目前它返回一个不可写的副本。有关问题的讨论,请参见 gh-7054。

  • 非结构化虚空数组的.item方法将返回一个字节对象。未来,在np.void数据类型的数组或标量上调用.item()将返回一个bytes对象,而不是一个缓冲区或 int 数组,与bytes(void_scalar)返回的相同。这可能影响假定返回值是可变的代码,但这将不再是这种情况。当发生这种情况时,现在会发出FutureWarning

兼容性说明

掩码数组视图的掩码也是视图而不是副本

NumPy 1.11.x 关于此更改的 FutureWarning。简而言之,现在这样的情况是,当改变掩码数组的视图时,掩码的更改会传播到原始的掩码。以前不是这样。这个更改特别影响切片。请注意,如果原始数组的掩码是nomask并且视图的掩码被更改,那么这种情况还不能很好地工作。有关详细讨论,请参见 gh-5580。通过调用视图的unshare_mask方法,可以获取拥有掩码副本的原始行为。

np.ma.masked不再可写

尝试改变masked常量现在会出错,因为底层数组被标记为只读。过去,可以通过:

# emulating a function that sometimes returns np.ma.masked
val = random.choice([np.ma.masked, 10])
var_arr = np.asarray(val)
val_arr += 1  # now errors, previously changed np.ma.masked.data 

np.ma生成fill_value的函数已更改

以前,np.ma.default_fill_value会返回一个 0d 数组,但np.ma.minimum_fill_valuenp.ma.maximum_fill_value将返回一个字段的元组。现在,所有三种方法都返回一个结构化的np.void对象,这就是您已经在.fill_value属性中找到的。

此外,dtype 猜测现在匹配np.array的 dtype - 因此当传递 python 标量x时,maximum_fill_value(x)总是与maximum_fill_value(np.array(x))相同。以前,在 Python 2 下x = long(1)违反了这个假设。

a.flat.__array__()a是不连续时返回非可写数组

意图是在未来,当a不连续时,以前返回的 UPDATEIFCOPY 数组将被可写副本替换。这个临时措施旨在通知那些期望在这种情况下修改底层数组的人,这种情况将不再发生。在这种情况下最有可能注意到这一点的地方是,当使用形式为np.asarray(a.flat)的表达式时,或者当a.flat被传递为 ufunc 的输出参数时。

np.tensordot现在在收缩长度为 0 的维度时返回零数组

以前当收缩长度为 0 的维度时,np.tensordot引发了 ValueError。现在它返回一个零数组,这与np.dotnp.einsum的行为一致。

numpy.testing重组

预计这不会导致问题,但可能会有遗漏。如果在使用numpy.testing时遇到意外的导入问题,请告诉我们。

np.asfarray不再通过dtype参数接受非数据类型

之前可以接受dtype=some_array,隐含的语义是dtype=some_array.dtype。这是未记录的,在 numpy 函数中是独一无二的,如果使用很可能对应于拼写错误。

1D np.linalg.norm保留浮点输入类型,即使对于任意顺序也是如此

以前,在传递任意顺序时,这将提升为float64,尽管在简单情况下却不这样做:

>>> f32 = np.float32([[1, 2]])
>>> np.linalg.norm(f32, 2.0, axis=-1).dtype
dtype('float32')
>>> np.linalg.norm(f32, 2.0001, axis=-1).dtype
dtype('float64')  # numpy 1.13
dtype('float32')  # numpy 1.14 

这个改变只影响float32float16数组。

count_nonzero(arr, axis=())现在不统计任何轴,而不是所有轴

在其他地方,axis ==()总是被理解为“没有轴”,但对于count_nonzero,有一个特殊情况将其视为“所有轴”。这是不一致的和令人惊讶的。计算所有轴的正确方法一直是传递axis == None

在测试目录中添加__init__.py文件

这是为了在不同目录中存在重复测试文件名的情况下兼容 pytest。结果,run_module_suite不再起作用,即 python <path-to-test-file> 会导致错误。

对无序 void 数组的.astype(bool)现在对每个元素调用bool

在 Python 2 上,void_array.astype(bool)总是返回一个True数组,除非 dtype 是V0。在 Python 3 上,这个操作通常会崩溃。前进时,astypebool(np.void)的行为匹配,将所有零的缓冲区视为 false,其他任何东西视为 true。仍然可以使用arr.dtype.itemsize == 0检查V0

MaskedArray.squeeze永远不会返回np.ma.masked

np.squeeze被记录为返回一个视图,但是掩码变体有时会返回masked,这不是一个视图。这一点已经得到了修复,所以结果总是原始掩码数组上的视图。这会破坏任何使用masked_arr.squeeze() is np.ma.masked的代码,但修复了对squeeze()的写入代码。

can_cast的第一个参数从from改名为from_

先前的参数名称from在 Python 中是一个保留关键字,这使得按名称传递参数变得困难。通过将参数重命名为from_来解决此问题。

当传入错误类型时,isnat会引发TypeError

isnat的 ufunc 传入的变量不是datetimetimedelta类型时,以前会引发ValueError,现在将引发TypeError

当传入错误类型时,dtype.__getitem__会引发TypeError

使用浮点数进行索引时,dtype 对象就会引发ValueError

用户定义的类型现在需要实现__str____repr__

以前,用户定义的类型可以回退到 numpy 中实现的__str____repr__的默认实现,但现在已将其删除。现在,用户定义的类型将回退到 python 默认的object.__str__object.__repr__

对数组打印进行了许多更改,可以使用新的“legacy”打印模式进行禁用。

ndarray 和 numpy 标量的strrepr已经以各种方式更改。这些更改可能会破坏下游用户的 doctest。

通过启用新的 1.13legacy打印模式,可以禁用这些新行为,以基本重现 numpy 1.13 行为。通过调用np.set_printoptions(legacy="1.13")或使用np.array2string的新legacy参数,如np.array2string(arr, legacy='1.13')

总之,主要变化有:

  • 对于浮点类型:

    • 浮点数组的repr通常会省略先前在符号位置打印的空格。请参阅np.set_printoptions的新选项sign

    • 浮点数数组和标量使用新的十进制表示算法,给出最短唯一表示。这通常会缩短float16部分输出,有时也会缩短float32float128输出。float64应该不受影响。请参阅np.set_printoptions的新选项floatmode

    • 使用科学计数法打印的浮点数组不再使用固定精度,而是显示最短唯一表示。

    • 在 python2 中不再截断浮点标量的str

  • 对于其他数据类型:

    • 非有限复数标量打印为nanj而不是nan*j

    • 现在可以正确对齐日期时间数组中的NaT值。

    • 现在使用十六进制表示法打印np.void数据类型的数组和标量。

  • 对于换行:

    • 如果数组输出的最后一行没有空间,ndarray 的 reprs 的“dtype”部分现在将打印在下一行。

    • 现在始终尊重linewidth格式选项。数组的reprstr永远不会超过此长度,除非单个元素过宽。

    • 数组字符串的最后一行的元素数量永远不会比前面的行多。

    • 如果元素过宽,第一行将不再插入额外的空格。

  • 用于摘要(使用...来缩短长数组):

    • 不再为str插入尾随逗号。先前,str(np.arange(1001))会给出'[   0    1    2 ...,  998  999 1000]',这里有一个额外的逗号。

    • 对于 2-D 及以上的数组,当 ... 单独打印在其自己的一行以总结除最后一个轴以外的任何内容时,现在会将换行符附加到该行上,以匹配其前导换行符,并删除末尾空格字符。

  • MaskedArray 数组现在用逗号分隔打印元素,始终打印数据类型,并正确换行长数组的元素。如果有超过 1 个维度,则数组属性现在以新的“左对齐”打印样式打印。

  • recarray 数组在其数据类型之前不再打印尾随空格,并且换行到正确数量的列。

  • 0 维数组不再具有其自己的特殊的 strrepr 实现。np.array2stringstyle 参数已被弃用。

  • 布尔数据类型的数组将在 repr 中省略数据类型。

  • 现在,用户定义的 dtypesnp.generic 的子类)现在需要实现 __str____repr__

以下是其中一些更详细的更改描述。如果需要保留以前的行为进行文档测试或其他原因,可能需要执行类似以下操作:

# FIXME: We need the str/repr formatting used in Numpy < 1.14.
try:
    np.set_printoptions(legacy='1.13')
except TypeError:
    pass 

C API 变更

PyPy 兼容的 UPDATEIFCOPY 数组的替代方案

UPDATEIFCOPY 数组是现有数组的连续副本,可能具有不同的尺寸,当它们的引用计数变为零并解除分配时,它们的内容被复制回原始数组。因为 PyPy 不使用引用计数,它们在 PyPy 中无法正常运行。NumPy 正在逐步消除其在内部的使用,并引进了两个新的 C-API 函数,

  • PyArray_SetWritebackIfCopyBase

  • PyArray_ResolveWritebackIfCopy,

新增了一些功能,以及补充标志 NPY_ARRAY_WRITEBACKIFCOPY。在创建新数组时,使用新功能还需要更改一些标志,即应该将 NPY_ARRAY_INOUT_ARRAY 替换为 NPY_ARRAY_INOUT_ARRAY2,将 NPY_ARRAY_INOUT_FARRAY 替换为 NPY_ARRAY_INOUT_FARRAY2。用这些新标志创建的数组将具有 WRITEBACKIFCOPY 语义。

如果不关心 PyPy 兼容性,可以忽略这些新函数,尽管会有 DeprecationWarning。如果确实希望追求 PyPy 兼容性,则可以在 c-api 文档和 how-to-extend 的示例中找到这些函数及其用法的更多信息。

新特性

对文本 IO 函数的编码参数

genfromtxtloadtxtfromregexsavetxt现在可以通过编码参数处理 Python 支持的任意编码的文件。为了向后兼容,该参数默认为特殊的bytes值,该值会继续将文本视为原始字节值,并将 latin1 编码字节传递给定制转换器。使用任何其他值(包括系统默认的None)将把函数切换到真正的文本 IO,因此在生成的数组中将接收到 unicode 字符串而不是字节。

外部的nose插件可以被numpy.testing.Tester使用

numpy.testing.Tester现在可以识别nose内置插件之外的nose插件。这允许例如像这样使用nose-timernp.test(extra_argv=['--with-timer', '--timer-top-n', '20'])以获得 20 个最慢测试的运行时间。Tester.test还新增了一个额外的关键字timer,因此np.test(timer=20)也将报告 20 个最慢的测试。

parametrize装饰器添加到numpy.testing

一个基本的parametrize装饰器现在可以在numpy.testing中使用。它旨在允许重写基于 yield 的测试,这些测试已经在 pytest 中被弃用,以便未来能够更容易地过渡到 pytest。nose 测试框架已经多年没有得到支持,看起来像是被抛弃的软件。

新的parametrize装饰器不具有 pytest 中的全部功能。它无法用于类,不支持嵌套,并且不会替换变量名。即便如此,它应该足以重写 NumPy 的测试。

chebinterpolate函数添加到numpy.polynomial.chebyshev

新的chebinterpolate函数在第一类 Chebyshev 点处对给定函数进行插值。Chebyshev.interpolate类方法新增了对第一类缩放和移位 Chebyshev 点进行任意间隔插值的支持。

在 Python 3 中支持解压缩为 lzma 的文本文件

包含lzma模块的 Python 版本现在可以透明地从具有xzlzma扩展名的文件中读取文本 IO 函数。

sign选项添加到np.setprintoptionsnp.array2string

此选项控制浮点类型的符号打印,可能是字符‘-’、‘+’或‘ ’。对于‘+’,numpy 始终打印正值的符号,对于‘ ’,它始终在正值的符号位置打印一个空格(空格字符),对于‘-’,它将省略正值的符号字符。新的默认值是‘-’。

这个新的默认值相对于 numpy 1.13 改变了浮点输出。旧的行为可以在 1.13 的“遗留”打印模式中获得,参见上面的兼容性说明。

hermitian选项添加到np.linalg.matrix_rank

新的hermitian选项允许在对称/厄米矩阵的标准 SVD 基础矩阵秩计算和更有效的特征值基础方法之间进行选择。

thresholdedgeitems选项添加到np.array2string

以前可以使用 np.set_printoptions 控制这些选项,但现在可以作为参数传递给 np.array2string,从而在每次调用时进行更改。

concatenatestack 增加了 out 参数

现在可以使用所需数据类型的预分配缓冲区来输出这些函数。

支持在 Windows 上使用 PGI flang 编译器

PGI flang 编译器是 NVIDIA 在 Apache 2 许可下发布的 LLVM 的 Fortran 前端。可以通过以下方式调用

python setup.py config --compiler=clang --fcompiler=flang install 

这个新编译器的使用经验很少,因此欢迎使用它的人提供任何反馈意见。

改进

random.noncentral_f 中的分子自由度只需要是正数。

在 NumPy 1.14.0 之前,分子自由度需要> 1,但分布对值> 0 有效,这是新要求。

对于所有 np.einsum 变体,GIL 都得到了释放

在 NumPy 1.14.0 之前,某些具有加速循环版本的特定循环结构在发布 GIL 之前尚未释放。这一疏忽已经得到了修复。

np.einsum 函数将在可能的情况下使用 BLAS,并默认进行优化

当适用时,np.einsum 函数现在将调用 np.tensordot。因为 np.tensordot 在可能的情况下使用 BLAS,这将加快执行速度。默认情况下,np.einsum 也会尝试进行优化,因为与速度提高的潜力相比,开销很小。

f2py 现在可以处理维度为 0 的数组

f2py 现在允许分配维度为 0 的数组。这样可以更一致地处理下游的边缘情况。

numpy.distutils 支持同时使用 MSVC 和 mingw64-gfortran

Numpy distutils 现在支持同时使用 Mingw64 gfortran 和 MSVC 编译器。这使得在 Windows 上包含包含 Fortran 代码的 Python 扩展模块并保持与 Python.org 分发的二进制文件的兼容性成为可能。不是所有用例都受支持,但大多数用于在 Python 中封装 Fortran 的常见方式都是功能的。

在编译模式下通常会自动启用此功能,并可以通过 setup.py--fcompiler--compiler 选项来选择。此外,支持将 Fortran 代码链接到静态 OpenBLAS;默认情况下,会查找 gfortran 兼容的静态存档 openblas.a

np.linalg.pinv 现在可以在堆叠矩阵上使用

以前限制为单个 2 维数组。

numpy.save 将数据与 64 字节对齐,而不是 16 字节

使用 numpy.savenpy 格式保存 NumPy 数组会在数组数据之前插入填充以使其在 64 字节处对齐。以前这只有 16 个字节(有时因为版本 2 的代码中的错误而更少)。现在对齐是 64 字节,这与常见的 SIMD 指令集匹配,并且也是最常见的缓存行大小。这使得 npy 文件在使用 mmap 打开它们的程序中更容易使用,特别是在 Linux 上,其中 mmap 偏移必须是页大小的倍数。

现在可以写入 NPZ 文件而不使用临时文件

在 Python 3.6+中,numpy.saveznumpy.savez_compressed现在直接写入 ZIP 文件,而不创建中间临时文件。

更好地支持空结构化和字符串类型

结构化类型可以包含零个字段,字符串类型可以包含零个字符。 仍然无法直接创建长度为零的字符串,并且必须通过结构化数据类型进行构造:

str0 = np.empty(10, np.dtype([('v', str, N)]))['v']
void0 = np.empty(10, np.void) 

可以一直使用这些,但是现在支持这些数组的以下操作:

  • arr.sort()
  • arr.view(bytes)
  • arr.resize(…)
  • pickle.dumps(arr)

np.lib.financialdecimal.Decimal的支持

除非另有说明,financial包中的所有函数现在都支持使用内置类型decimal.Decimal

浮点数打印现在使用“dragon4”算法来进行最短的十进制表示

浮点值(16、32、64 和 128 位)的strrepr现在打印为给出与同一类型的其他值唯一标识该值的最短十进制表示。 以前只对float64值成立。 现在通常比 Numpy 1.13 中的其他浮点类型要短。 以前,科学记数法中的数组也使用最短的科学表示形式,而不是以前的固定精度。

此外,float 标量的str在 python2 中不再被截断,不像 python2 的floats。 np.double标量现在具有与 python3 float 相同的strrepr

提供了新函数np.format_float_scientificnp.format_float_positional来生成这些十进制表示。

np.set_printoptionsnp.array2string现在增加了一个名为floatmode的选项,这可以控制数组中打印元素的唯一性和四舍五入。 新的默认值是floatmode='maxprec',具有precision=8,它将最多打印 8 个小数位,或者如果一个变元可以以更少的小数位唯一表示,则会打印更少。 一个有用的新模式是floatmode="unique",它将输出足够的数字以唯一地指定数组元素。

具有诸如inf*jnan*j值的 Numpy 复数浮点标量现在打印为infjnanj,就像纯 Python complex类型一样。

FloatFormatLongFloatFormat类已被弃用,并且应分别由FloatingFormat取代。 同样,ComplexFormatLongComplexFormat应被ComplexFloatingFormat取代。

void数据类型元素现在以十六进制表示打印

与 python bytes类型兼容的十六进制表示现在用于打印无结构的np.void元素,例如V4数据类型。 以前,在 python2 中,元素的原始 void 数据被打印到标准输出,或者在 python3 中显示整数字节值。

void数据类型的打印样式现在可以独立自定义

np.void数组的打印样式现在可以独立自定义,使用np.set_printoptionsformatter参数,使用'void'键,而不是以前的通用numpystr键。

减少了np.loadtxt的内存使用

np.loadtxt现在会分块读取文件,而不是一次性读取,这会显著减少其对大文件的内存使用。

变化

多个字段的结构化数组的索引/赋值

多字段结构化数组的索引和赋值在许多方面已经发生了变化,正如在先前版本中警告的那样。

首先,使用多个字段的结构化数组进行索引,例如arr[['f1', 'f3']],返回原始数组的视图,而不是副本。返回的视图将具有对应于原始数组中介字段的额外填充字节,不同于 1.13 中的副本,这将影响arr[['f1', 'f3']].view(newdtype)这样的代码。

其次,现在在结构化数组之间的赋值将“按位置”而不是“按字段名”进行。目标数组的第 N 个字段将设置为源数组的第 N 个字段,而不考虑字段名,不同于 numpy 版本 1.6 到 1.13,其中目标数组中的字段被设置为源数组中同名的字段,或者如果源数组没有字段,则设置为 0。

相应地,在计算数据类型相等性时,结构化数据类型中字段的顺序现在很重要。例如,对于数据类型

x = dtype({'names': ['A', 'B'], 'formats': ['i4', 'f4'], 'offsets': [0, 4]})
y = dtype({'names': ['B', 'A'], 'formats': ['f4', 'i4'], 'offsets': [4, 0]}) 

现在,表达式x == y将返回False,与以前不同。这使得 python < 3.6 中的基于字典的数据类型规范(例如dtype({'a': ('i4', 0), 'b': ('f4', 4)}))变得危险,因为这些版本中不保留字典键的顺序。

从一个结构化数组到布尔数组的赋值现在会引发 ValueError,不同于 1.13 版,它总是将目标元素设置为True

从具有多于一个字段的结构化数组到非结构化数组的赋值现在会引发 ValueError。在 1.13 版中,它只是将源数组的第一个字段复制到目标数组中。

现在不允许在多字段索引中使用字段“标题”,也不允许在多字段索引中重复字段名。

用户指南中关于结构化数组的文档已经得到显著更新,以反映这些变化。

整数和空虚标量现在不受np.set_string_function的影响

与大多数其他 numpy 标量不同,以前,整数和空虚标量的strrepr可以通过np.set_string_function进行控制。这不再可能。

0d 数组打印已更改,array2stringstyle参数被弃用

以前的 0d 数组的strrepr具有独特的实现,分别返回str(a.item())'array(' + repr(a.item()) + ')',对于 0d 数组a,与 numpy 标量和更高维 ndarrays 不同。

现在,0d 数组的str行为像一个 numpy 标量,使用str(a[()]),而repr的行为像更高维数组,使用formatter(a[()]),其中formatter可以使用np.set_printoptions指定。np.array2stringstyle参数已被弃用。

这种新的行为在 1.13 版的传统打印模式中已被禁用,参见上面的兼容性注意事项。

使用数组种子化RandomState需要一个一维数组

以前的RandomState将接受空数组或 2 个或更多维的数组,这导致了无法进行种子化(空数组)或在设置种子时忽略了一些传递的值。

MaskedArray对象显示了更有用的repr

MaskedArrayrepr现在更接近生成它的 python 代码,数组现在用逗号和 dtypes 显示。与其他格式更改一样,可以使用 1.13 遗留打印模式禁用这个功能,以帮助过渡 doctests。

np.polynomial类的repr更加明确

现在显示领域和窗口参数作为关键字参数,以使它们更清晰:

>>> np.polynomial.Polynomial(range(4))
Polynomial([0.,  1.,  2.,  3.], domain=[-1,  1], window=[-1,  1]) 

亮点

  • np.einsum函数在可能的情况下使用 BLAS

  • genfromtxtloadtxtfromregexsavetxt现在可以处理任意 Python 支持的编码的文件。

  • 对 NumPy 数组和标量进行打印的重大改进。

新函数

  • parametrize:添加到 numpy.testing 的装饰器

  • chebinterpolate:在切比雪夫点处插值函数。

  • format_float_positionalformat_float_scientific:以可控制舍入和填充的方式格式化浮点标量。

  • 新的 C-API 函数PyArray_ResolveWritebackIfCopyPyArray_SetWritebackIfCopyBase对于实现 PyPy 兼容性非常有用。

弃用

  • 使用np.bool_对象代替整数已被弃用。以前的operator.index(np.bool_)是合法的,并且允许构造[1, 2, 3][np.True_]这样的语句。这是误导性的,因为它与np.array([1, 2, 3])[np.True_]的行为不同。

  • 对空数组进行真值测试已被弃用。要检查数组是否不为空,请使用array.size > 0

  • 使用minlength=None调用np.bincount已被弃用。应改用minlength=0

  • 弃用使用默认值的sep参数调用np.fromstring。当未提供该参数时,将使用np.frombuffer的版本,它默默地接受 Unicode 字符串,并在将它们编码为 utf-8(python 3)或默认编码(python 2)后将其视为二进制数据。如果要读取二进制数据,应直接使用np.frombuffer

  • 在非遗留打印模式中,array2stringstyle选项已被弃用。

  • PyArray_SetUpdateIfCopyBase已被弃用。对于 NumPy 版本>=1.14,请改用PyArray_SetWritebackIfCopyBase,有关更多详细信息,请参见下面的C API changes

  • 弃用使用UPDATEIFCOPY数组,有关详细信息,请参见下面的C API changes。我们不会放弃对这些数组的支持,但它们与 PyPy 不兼容。

未来变更

  • np.issubdtype将停止对 dtype-like 参数的降级。也许人们会期望issubdtype(np.float32, 'float64')issubdtype(np.float32, np.float64)是相同的 - 但是,存在一个未记录的特殊情况,将前者转换为issubdtype(np.float32, np.floating),产生了令人惊讶的结果。

    此版本现在会发出一个警告,解释正在进行的翻译。在未来,将禁用翻译,并且第一个示例将与第二个示例等效。

  • np.linalg.lstsqrcond默认将被更改。np.linalg.lstsqrcond参数将将其默认值更改为机器精度乘以输入数组维度的最大值。当未明确传递rcond时,将发出 FutureWarning。

  • a是非连续的时,a.flat.__array__()将返回a的可写副本。以前,当a是可写的时,它返回了一个 UPDATEIFCOPY 数组。目前它返回一个不可写的副本。请参见 gh-7054 进行相关讨论。

  • 无结构 void 数组的.item方法将返回一个字节对象。在未来,对np.void数据类型的数组或标量调用.item()将返回一个bytes对象,而不是 buffer 或 int 数组,与bytes(void_scalar)返回的内容相同。这可能会影响假定返回值是可变的代码,但这不再是情况。当发生这种情况时,将现在发出FutureWarning

兼容性说明

掩码数组的视图掩码也是视图而不是副本

在 NumPy 1.11.x 中有一个有关此更改的 FutureWarning。简而言之,现在的情况是,当改变一个掩码数组的视图时,掩码的更改会传播到原始数组上。以前不是这样的。此更改特别影响切片。请注意,如果原始数组的掩码为nomask,并且更改了视图的掩码,则尚不完全正常工作。请参见 gh-5580 进行更多讨论。可以通过调用视图的unshare_mask方法来获得有一份掩码副本的原始行为。

np.ma.masked不再可写

现在,试图对masked常量进行突变会报错,因为底层数组被标记为只读。过去,可以这样做:

# emulating a function that sometimes returns np.ma.masked
val = random.choice([np.ma.masked, 10])
var_arr = np.asarray(val)
val_arr += 1  # now errors, previously changed np.ma.masked.data 

产生fill_valuenp.ma函数已经改变

以前,np.ma.default_fill_value将返回一个 0 维数组,但np.ma.minimum_fill_valuenp.ma.maximum_fill_value将返回一个字段的元组。相反,这三个方法都返回一个结构化的np.void对象,这是您已经在.fill_value属性中找到的内容。

另外,现在的 dtype 猜测与np.array的匹配 - 因此,当传递一个 python 标量x时,maximum_fill_value(x)总是与maximum_fill_value(np.array(x))相同。以前,x = long(1)在 Python 2 中违反了这个假设。

a是非连续的时,a.flat.__array__()返回的数组将是不可写的

意图是,当 a 是非连续的时,先前在返回 UPDATEIFCOPY 数组将来会被可写副本所替代。这个临时措施旨在通知那些期望在这种情况下修改底层数组的人,这将不再是情况。最有可能注意到这一点的地方是当使用形式为 np.asarray(a.flat) 的表达式时,或者当将 a.flat 作为 ufunc 的 out 参数传递时。

现在在收缩为 0 长度维度时,np.tensordot 返回零数组

以前,np.tensordot在收缩为 0 长度维度时会引发 ValueError。现在它返回零数组,这与np.dotnp.einsum的行为一致。

numpy.testing 重新组织

预计这不会导致问题,但可能漏掉了一些内容。如果您在使用 numpy.testing 时遇到意外的导入问题,请告诉我们。

np.asfarray 不再通过 dtype 参数接受非 dtype 输入

先前可以接受 dtype=some_array,其中隐含的语义是 dtype=some_array.dtype。这是不详尽的,numpy 函数中独一无二的,如果使用可能会对应拼写错误。

1D 的np.linalg.norm 会保留浮点输入类型,甚至对任意顺序

先前,当传递任意顺序时,这将提升为 float64,尽管在简单情况下不会这样做:

>>> f32 = np.float32([[1, 2]])
>>> np.linalg.norm(f32, 2.0, axis=-1).dtype
dtype('float32')
>>> np.linalg.norm(f32, 2.0001, axis=-1).dtype
dtype('float64')  # numpy 1.13
dtype('float32')  # numpy 1.14 

此更改仅影响 float32float16 数组。

count_nonzero(arr, axis=()) 现在计算没有轴,而不是所有轴

在其他地方,axis==() 始终被理解为“没有轴”,但 count_nonzero 有一个特殊情况,将其视为“所有轴”。这是不一致和令人惊讶的。在所有轴上计数的正确方法始终是传递 axis == None

在测试目录中添加了 __init__.py 文件

这是为了 pytest 在不同目录中具有重复测试文件名的情况下的兼容性。结果,run_module_suite不再起作用,即,python <path-to-test-file>会导致错误。

在无结构的 void 数组上的.astype(bool) 现在在每个元素上调用 bool

在 Python 2 上,void_array.astype(bool) 总是返回一个True数组,除非 dtype 为V0。在 Python 3 上,此操作通常会崩溃。从现在开始,astypebool(np.void) 的行为相匹配,将所有零缓冲区视为 false,而其他任何内容视为 true。检查V0仍可以通过 arr.dtype.itemsize == 0 完成。

MaskedArray.squeeze 永远不会返回 np.ma.masked

np.squeeze 被记录为返回一个视图,但掩码变体有时会返回 masked,这不是一个视图。已修复此问题,因此结果始终是原始掩码数组上的视图。这会中断使用 masked_arr.squeeze() is np.ma.masked 的任何代码,但修复了写入 squeeze() 结果的代码。

can_cast 的第一个参数重命名为 from_

以前的参数名称from在 Python 中是一个保留关键字,这使得通过名称传递参数变得困难。将参数重命名为from_来解决了这个问题。

当传递错误类型时,isnat引发TypeError

isnat的 ufunc 在不传递datetimetimedelta类型的变量时曾经会引发ValueError,现在将引发TypeError

当传递错误类型时,dtype.__getitem__引发TypeError

当用浮点数索引时,dtype 对象曾经会引发ValueError

用户定义的类型现在需要实现__str____repr__

以前,用户定义的类型可以退回到 numpy 中实现的__str____repr__的默认实现,但现在已经移除。现在用户定义的类型将退回到 python 默认的object.__str__object.__repr__

许多对数组打印的更改,可以通过新的“legacy”打印模式来禁用。

ndarrays 和 numpy 标量的strrepr已经以各种方式进行了更改。这些变化可能会破坏下游用户的 doctests。

这些新的行为可以通过启用新的 1.13legacy打印模式来禁用,可以通过调用np.set_printoptions(legacy="1.13")来启用,或者通过np.array2string的新legacy参数来使用,例如np.array2string(arr, legacy='1.13')

总而言之,主要的变化有:

  • 对于浮点类型:

    • 浮点数数组的repr通常省略了以前在符号位置打印的空格。参见np.set_printoptions的新sign选项。

    • 浮点数组和标量使用新的十进制表示算法,给出最短的唯一表示形式。这通常会缩短float16的小数输出,有时会缩短float32float128的输出。float64不受影响。参见np.set_printoptions的新floatmode选项。

    • 科学计数法打印的浮点数数组不再使用固定精度,而是展示最短的唯一表示形式。

    • 浮点标量的str在 python2 中不再被截断。

  • 对于其他数据类型:

    • 非有限复数标量打印形式为nanj,而不是nan*j

    • 日期时间数组中的NaT值现在可以正确对齐了。

    • 数组和np.void数据类型的标量现在以十六进制表示方式进行打印。

  • 对于换行:

    • 如果数组输出的最后一行没有空间,ndarray reprs 的“dtype”部分现在将在下一行打印。

    • linewidth格式选项现在会始终受到尊重。数组的reprstr不会超过这个宽度,除非单个元素太宽。

    • 数组字符串的最后一行将不再比以前的行含有更多的元素。

    • 如果元素过宽,第一行不再插入额外的空格。

  • 对于摘要(使用...来缩短长数组):

    • 不再为str插入尾逗号。以前,str(np.arange(1001)给出的结果是'[   0    1    2 ...,  998  999 1000]',这多了一个逗号。

    • 对于 2-D 及以上维度的数组,当在单独一行上打印...以概括除了最后一维之外的任何维度时,现在会添加换行符以匹配其前导换行符,并且删除尾随空格字符。

  • MaskedArray数组现在用逗号分隔打印的元素,总是打印 dtype,并且正确地将长数组的元素换行到多行。如果数组有多于 1 个维度,数组属性现在以新的“左对齐”打印风格呈现。

  • recarray数组在其 dtype 之前不再打印尾随空格,并且根据正确的列数进行换行。

  • 0 维数组不再具有它们自己独特的strrepr实现。np.array2stringstyle参数被弃用。

  • bool数据类型的数组将在repr中省略数据类型。

  • 用户定义的dtypesnp.generic的子类)现在需要实现__str____repr__

以下是更详细描述的一些这些变化。如果你需要保留以前的行为用于 doctests 或其他原因,你可能需要做类似的事情:

# FIXME: We need the str/repr formatting used in Numpy < 1.14.
try:
    np.set_printoptions(legacy='1.13')
except TypeError:
    pass 

掩码数组视图的掩码也是一个视图而不是一个副本

在 NumPy 1.11.x 中有一个有关这个变化的 FutureWarning。简而言之,当改变掩码数组的视图时,掩码的更改会传播到原始数组。以前不是这种情况。这个变化特别影响切片。请注意,如果原始数组的掩码是nomask并且视图的掩码被改变,这种情况仍然无效。参见 gh-5580 进行更详尽的讨论。通过调用视图的unshare_mask方法可以获得具有掩码副本的原始行为。

np.ma.masked现在不再可写

尝试改变masked常量的操作现在会出错,因为底层数组被标记为只读。过去,可以这样做:

# emulating a function that sometimes returns np.ma.masked
val = random.choice([np.ma.masked, 10])
var_arr = np.asarray(val)
val_arr += 1  # now errors, previously changed np.ma.masked.data 

生成fill_valuenp.ma函数已经改变

以前,np.ma.default_fill_value会返回一个 0 维数组,但np.ma.minimum_fill_valuenp.ma.maximum_fill_value会返回一个字段的元组。相反,所有三种方法都返回一个结构化的np.void对象,这就是你在.fill_value属性中已经找到的内容。

此外,dtype 的猜测现在与np.array的匹配-因此当传递一个 python 标量x时,maximum_fill_value(x)总是和maximum_fill_value(np.array(x))一样。以前的 Python 2 上的x = long(1)违反了这个假设。

a是不连续的时,a.flat.__array__()返回不可写的数组

目的是,以前在 a 非连续时返回的 UPDATEIFCOPY 数组将被在将来替换为可写副本。这是一个临时措施,旨在通知那些期望在这种情况下修改底层数组的人,这将不再是事实。最有可能注意到这一点的地方是当使用形式为 np.asarray(a.flat) 的表达式,或者当 a.flat 作为 ufunc 的输出参数传递时。

当在 0 长度维度上收缩时,np.tensordot 现在返回零数组

以前,当在 0 长度维度上收缩时,np.tensordot 会引发一个 ValueError。现在它返回一个零数组,这与 np.dotnp.einsum 的行为一致。

numpy.testing 重新组织

预计这不会引起问题,但可能会有遗漏。如果您在使用 numpy.testing 时遇到意外的导入问题,请告诉我们。

np.asfarray 不再通过 dtype 参数接受非 dtype

以前可以通过 dtype=some_array 接受,隐含的语义是 dtype=some_array.dtype。这是未记录的,在 numpy 函数中是唯一的,如果使用可能会对应于打字错误。

1D np.linalg.norm 保留 float 输入类型,甚至在任意顺序下

以前,当传递任意顺序时,这将晋升为 float64,尽管在简单情况下不会这样做:

>>> f32 = np.float32([[1, 2]])
>>> np.linalg.norm(f32, 2.0, axis=-1).dtype
dtype('float32')
>>> np.linalg.norm(f32, 2.0001, axis=-1).dtype
dtype('float64')  # numpy 1.13
dtype('float32')  # numpy 1.14 

此更改仅影响 float32float16 数组。

count_nonzero(arr, axis=()) 现在不再计算任何轴,而是不计算所有轴

在其他地方,axis==() 总是被理解为“没有轴”,但 count_nonzero 有一个特殊情况,将此视为“所有轴”。这是不一致的和出乎意料的。始终计算所有轴的正确方式一直是传递 axis == None

__init__.py 文件添加到测试目录

这是为了 pytest 兼容性,以防不同目录中存在相同的测试文件名。结果,run_module_suite 不再起作用,即,python <path-to-test-file> 会导致错误。

在非结构化空数组上执行.astype(bool)现在调用每个元素的 bool

在 Python 2 中,void_array.astype(bool) 总是返回一个 True 数组,除非 dtype 是 V0。在 Python 3 中,此操作通常会崩溃。未来,astypebool(np.void) 的行为匹配,将所有零的缓冲区视为假,将其他任何东西视为真。仍然可以使用 arr.dtype.itemsize == 0 来检查 V0

MaskedArray.squeeze 永远不会返回 np.ma.masked

np.squeeze 被记录为返回一个视图,但是掩盖的变体有时会返回 masked,这不是一个视图。这已经得到修复,所以结果始终是对原始掩码数组的视图。这打破了任何使用 masked_arr.squeeze() is np.ma.masked 的代码,但修复了对 squeeze() 的结果进行写操作的代码。

from 重命名为 from_can_cast 的第一个参数

先前的参数名from是 Python 中的保留关键字,这使得通过名称传递参数变得困难。通过将参数重命名为from_来解决此问题。

isnat 在传递错误类型时引发 TypeError

isnat ufunc 在不传递datetimetimedelta类型变量时曾引发ValueError。现在改为引发TypeError

dtype.__getitem__ 在传递错误类型时引发 TypeError

当使用浮点数索引时,dtype 对象曾引发 ValueError

现在,用户定义的类型需要实现 __str____repr__

以前,用户定义的类型可能会回退到由 numpy 实现的__str____repr__的默认实现,但现在已将其移除。现在,用户定义的类型将回退到 python 默认的object.__str__object.__repr__

对数组打印进行了许多更改,可以通过新的“legacy”打印模式进行禁用。

ndarrays 和 numpy 标量的 strrepr 已经以各种方式更改。这些更改可能会破坏下游用户的 doctests。

可以通过启用新的 1.13legacy打印模式来禁用这些新行为,从而基本重现 numpy 1.13 的行为。通过调用np.set_printoptions(legacy="1.13"),或者使用新的np.array2stringlegacy参数,如np.array2string(arr, legacy='1.13')

总结一下,主要变化如下:

  • 对于浮点类型:

    • 浮点数组的 repr 在以前打印的符号位置通常省略了一个空格。参见np.set_printoptions的新sign选项。

    • 浮点数组和标量使用新算法进行十进制表示,给出最短唯一表示。这通常会缩短 float16 分数输出,有时会缩短 float32float128 输出。float64 应该不受影响。参见np.set_printoptions的新floatmode选项。

    • 打印为科学计数法的浮点数数组不再使用固定精度,而是显示最短唯一表示。

    • 浮点标量的 str 在 python2 中不再被截断。

  • 对于其他数据类型:

    • 非有限复数标量打印为 nanj 而不是 nan*j

    • datetime 数组中的NaT值现在被正确对齐。

    • np.void 数据类型的数组和标量现在使用十六进制表示法打印。

  • 对于换行:

    • ndarray reprs 的“dtype”部分现在将在数组输出的最后一行没有空间时打印在下一行。

    • linewidth 格式选项现在始终被尊重。除非单个元素过宽,否则数组的 reprstr 永远不会超过此选项。

    • 数组字符串的最后一行元素不会比较早的行多。

    • 如果元素过宽,则不再在第一行插入额外的空格。

  • 对于总结(使用...缩短长数组的方法):

    • 不再为 str 插入尾随逗号。以前,str(np.arange(1001)) 给出的结果是 '[   0    1    2 ...,  998  999 1000]',有一个额外的逗号。

    • 对于二维及以上的数组,当...自己单独打印以总结除最后一个轴外的任何内容时,现在将向该行附加换行符以匹配其首行的换行符,并移除尾随空格字符。

  • MaskedArray数组现在使用逗号分隔打印的元素,总是打印 dtype,并正确将长数组的元素分行打印。如果有多个维度,现在会以新的“左对齐”打印样式打印数组属性。

  • recarray数组不再在其 dtype 之前打印尾随空格,并且适应右列数。

  • 0d 数组不再具有其自己的特殊的strrepr实现。np.array2stringstyle参数已被弃用。

  • bool数据类型的数组将在repr中省略数据类型。

  • 用户定义的dtypesnp.generic的子类)现在需要实现__str____repr__

一些更改将在下面更详细地描述。如果您需要保留以前的行为以进行文档测试或其他原因,您可能需要进行以下操作:

# FIXME: We need the str/repr formatting used in Numpy < 1.14.
try:
    np.set_printoptions(legacy='1.13')
except TypeError:
    pass 

C API 更改

PyPy 兼容的UPDATEIFCOPY数组的替代品

UPDATEIFCOPY数组是现有数组的连续副本,可能具有不同的维度,其内容在其引用计数减为零并被释放时被复制回原始数组。因为 PyPy 不使用引用计数,所以它们在 PyPy 中无法正常工作。NumPy 正在逐步消除其在内部的使用,并两个新的 C-API 函数,

  • PyArray_SetWritebackIfCopyBase

  • PyArray_ResolveWritebackIfCopy,

已添加,以及补充的标志,NPY_ARRAY_WRITEBACKIFCOPY。使用新功能还需要在创建新数组时更改一些标志,即:NPY_ARRAY_INOUT_ARRAY应该被NPY_ARRAY_INOUT_ARRAY2替换,NPY_ARRAY_INOUT_FARRAY应该被NPY_ARRAY_INOUT_FARRAY2替换。然后使用这些新标志创建的数组将具有WRITEBACKIFCOPY语义。

如果不关心 PyPy 兼容性,可以忽略这些新功能,尽管会有DeprecationWarning。如果确实希望追求 PyPy 兼容性,可以在 c-api 文档和 how-to-extend 中找到有关这些功能及其使用的更多信息。

PyPy 兼容的UPDATEIFCOPY数组的替代品

UPDATEIFCOPY数组是现有数组的连续副本,可能具有不同的维度,其内容在其引用计数减为零并被释放时被复制回原始数组。因为 PyPy 不使用引用计数,所以它们在 PyPy 中无法正常工作。NumPy 正在逐步消除其在内部的使用,并两个新的 C-API 函数,

  • PyArray_SetWritebackIfCopyBase

  • PyArray_ResolveWritebackIfCopy,

添加了一个补充标志NPY_ARRAY_WRITEBACKIFCOPY。使用这些新功能还需要在创建新数组时更改一些标志,即应该用NPY_ARRAY_INOUT_ARRAY2替换NPY_ARRAY_INOUT_ARRAY,并且应该用NPY_ARRAY_INOUT_FARRAY2替换NPY_ARRAY_INOUT_FARRAY。然后使用这些新标志创建的数组将具有WRITEBACKIFCOPY的语义。

如果不关心 PyPy 的兼容性,可以忽略这些新函数,尽管会有DeprecationWarning。如果希望追求 PyPy 的兼容性,可以在c-api文档中找到这些函数及其用法的更多信息,并在how-to-extend中找到示例。

新功能

文本 IO 函数的编码参数

genfromtxtloadtxtfromregexsavetxt现在可以处理通过编码参数支持的任意编码的文件。为了向后兼容,该参数默认为特殊的bytes值,它将继续将文本视为原始的字节值,并继续将 latin1 编码的字节传递给自定义转换器。使用任何其他值(包括None表示系统默认)将使函数切换到真正的文本 IO,因此在生成的数组中将收到 Unicode 字符串而不是字节。

numpy.testing.Tester可以使用外部的nose插件

numpy.testing.Tester 现在可以识别 nose 的插件,这些插件不是nose内置的。这允许使用像这样的插件,例如nose-timernp.test(extra_argv=['--with-timer', '--timer-top-n', '20'])来获得最慢的 20 个测试的运行时间。Tester.test还添加了一个额外的关键字timer,所以np.test(timer=20)也会报告最慢的 20 个测试。

parametrize装饰器添加到numpy.testing

基本的parametrize装饰器现在在numpy.testing中可用。它旨在允许重写已在 pytest 中弃用的基于 yield 的测试,以便将来能够更容易地过渡到 pytest。nose 测试框架已经没有得到支持好几年了,现在看起来像是废弃的软件。

新的parametrize装饰器没有 pytest 中的全部功能。它不能用于类,不支持嵌套,并且不会替换变量名。即便如此,它应该足以重写 NumPy 测试。

numpy.polynomial.chebyshev中添加了chebinterpolate函数

新的chebinterpolate函数在第一类切比雪夫点上对给定函数进行插值。新的Chebyshev.interpolate类方法增加了对使用第一类切比雪夫点的任意区间进行插值的支持。

支持在 Python 3 中读取 lzma 压缩的文本文件

使用包含lzma模块的 Python 版本,文本 IO 函数现在可以透明地从具有xzlzma扩展名的文件中读取

np.setprintoptionsnp.array2string新增了sign选项

此选项用于控制浮点类型的符号打印,可以是字符‘-’、‘+’或‘ ’。使用‘+’ numpy 总是打印正值的符号,使用‘ ’它总是在正值的符号位置上打印空格(空白字符),使用‘-’它将省略正值的符号字符。新的默认值是‘-‘

这种新的默认设置相对于 numpy 1.13 改变了浮点输出。可以在 1.13“遗留”打印模式中获得旧的行为,参见上述兼容性说明。

np.linalg.matrix_rank新增了hermitian选项

新的hermitian选项允许在标准 SVD 基础矩阵秩计算和对称/共轭矩阵的更有效的特征值基础方法之间进行选择。

np.array2string新增了thresholdedgeitems选项

这些选项以前可以通过np.set_printoptions进行控制,但现在可以作为np.array2string的参数在每次调用时进行更改

concatenatestack增加了out参数

所需 dtype 的预分配缓冲区现在可以用于这些函数的输出。

在 Windows 上支持 PGI flang 编译器

PGI flang 编译器是由 NVIDIA 在 Apache 2 许可下发布的 LLVM 的 Fortran 前端。可以通过以下方式调用

python setup.py config --compiler=clang --fcompiler=flang install 

对于这种新编译器的经验很少,因此将非常感谢使用它的人们的任何反馈。

文本 IO 函数的编码参数

genfromtxtloadtxtfromregexsavetxt现在可以处理由 Python 支持的任意编码的文件,通过encoding参数。为了向后兼容,参数默认为特殊的bytes值,该值继续将文本视为原始字节值,并继续将 latin1 编码的字节传递给自定义转换器。使用任何其他值(包括None用于系统默认值)将使函数切换到真正的文本 IO,因此在结果数组中将收到 Unicode 字符串而不是字节。

外部nose插件可以被numpy.testing.Tester使用

numpy.testing.Tester现在可识别在nose内置插件之外的nose插件。这允许使用例如nose-timer的插件,如此:np.test(extra_argv=['--with-timer', '--timer-top-n', '20'])就可以获得 20 个最慢测试的运行时间。Tester.test还新增了一个额外的关键字timer,所以np.test(timer=20)也会报告 20 个最慢的测试。

numpy.testing中新增了parametrize装饰器

numpy.testing现在提供了一个基本的parametrize装饰器。它旨在允许重写基于 yield 的测试,这些测试已被 pytest 弃用,以便在将来方便过渡到 pytest。鼻子测试框架已经没有得到支持多年,看起来像是弃用软件。

新的 parametrize 装饰器没有 pytest 中的完整功能。它不适用于类, 不支持嵌套, 也不能替换变量名。即便如此, 它应该足以重写 NumPy 测试。

numpy.polynomial.chebyshev 中新增了 chebinterpolate 函数。

新的 chebinterpolate 函数在第一类切比雪夫点上插值给定函数。 Chebyshev.interpolate 类方法的新增支持使用第一类 scaled 和 shifted 切比雪夫点在任意区间进行插值。

支持在 Python 3 中读取 lzma 压缩的文本文件。

对于包含 lzma 模块的 Python 版本, 文本 IO 函数现在可以透明地读取 xzlzma 扩展名的文件。

np.setprintoptionsnp.array2string 新增了 sign 选项。

这个选项控制浮点类型的符号打印, 可以是 '-', '+' 或 ' ' 之一。使用 '+' 时 NumPy 总是打印正值的符号, 使用 ' ' 时它总是在正值位置打印空格(空白字符), 使用 '-' 时它将省略正值的符号字符。新的默认值是 '-'。

这个新的默认设置改变了相对于 NumPy 1.13 的浮点输出。在 1.13 "legacy" 打印模式下可以获得旧的行为, 请参阅上面的兼容性说明。

np.linalg.matrix_rank 新增了 hermitian 选项。

新的 hermitian 选项允许在标准 SVD 基础矩阵秩计算和更高效的特征值基础方法之间进行选择, 用于对称/厄米矩阵。

np.array2string 新增了 thresholdedgeitems 选项。

这些选项以前可以使用 np.set_printoptions 进行控制, 但现在可以作为参数传递给 np.array2string 来进行单独设置。

concatenatestack 新增了 out 参数。

现在可以使用预先分配的所需数据类型的缓冲区作为这些函数的输出。

支持在 Windows 上使用 PGI flang 编译器。

PGI flang 编译器是 NVIDIA 发布的 Apache 2 许可的 LLVM 的 Fortran 前端。它可以通过以下方式调用:

python setup.py config --compiler=clang --fcompiler=flang install 

我们对这个新编译器还缺乏经验, 所以欢迎使用它的人提供反馈。

改进

random.noncentral_f 中的分子自由度只需为正值。

在 NumPy 1.14.0 之前, 分子自由度需要 > 1, 但该分布对 > 0 的值有效, 这是新的要求。

为所有 np.einsum 变体释放了 GIL。

在 NumPy 1.14.0 之前, 一些具有加速循环版本的特定循环结构未能释放 GIL。这一疏忽已得到修复。

np.einsum 函数在可能时将使用 BLAS, 并默认进行优化。

np.einsum函数现在在适当时将调用np.tensordot。因为np.tensordot在可能时使用 BLAS,这将加快执行速度。默认情况下,np.einsum还将尝试优化,因为开销相对较小,相对于速度的潜在改进。

f2py现在处理 0 维度数组

f2py现在允许分配 0 维度数组。这允许更一致地处理下游的边界情况。

numpy.distutils支持在 MSVC 和 mingw64-gfortran 上一起使用

Numpy distutils 现在支持在一起使用 Mingw64 gfortran 和 MSVC 编译器。这使得在 Windows 上产生包含 Fortran 代码的 Python 扩展模块并保留与由 Python.org 分发的二进制文件兼容性成为可能。并非所有用例都受支持,但大多数用于为 Python 包装 Fortran 的常见方法都是可用的。

在此模式下通常会自动启用编译,并可以通过setup.py--fcompiler--compiler选项进行选择。此外,支持将 Fortran 代码链接到静态 OpenBLAS;默认情况下,将搜索 gfortran 兼容的静态存档openblas.a

np.linalg.pinv现在在堆叠矩阵上工作

以前仅限于单个 2d 数组。

numpy.save将数据对齐到 64 字节,而不是 16 字节。

使用numpy.savenpy格式保存 NumPy 数组会在数组数据之前插入填充以将其对齐到 64 字节。以前只有 16 字节(有时由于版本 2 中代码中的错误而少)。现在对齐是 64 字节,与最常见的 SIMD 指令集匹配,并且是最常见的缓存行大小。这使npy文件在使用mmap打开它们的程序中更容易使用,特别是在 Linux 上,其中mmap的偏移量必须是页大小的倍数。

现在可以在不使用临时文件的情况下写入 NPZ 文件

在 Python 3.6+中,numpy.saveznumpy.savez_compressed现在直接写入 ZIP 文件,而不创建中间临时文件。

更好地支持空的结构化和字符串类型

结构化类型可以不包含任何字段,字符串 dtype 可以包含零个字符。仍然无法直接创建零长度的字符串,必须通过结构化 dtype 构造:

str0 = np.empty(10, np.dtype([('v', str, N)]))['v']
void0 = np.empty(10, np.void) 

以前就可以使用这些,但现在对这些数组支持以下操作:

  • arr.sort()
  • arr.view(bytes)
  • arr.resize(…)
  • pickle.dumps(arr)

支持在np.lib.financial中使用decimal.Decimal

除非另有说明,financial包中的所有函数现在都支持使用decimal.Decimal内置类型。

浮点数打印现在使用“dragon4”算法来进行最短的十进制表示

浮点值(16、32、64 和 128 位)的strrepr现在打印出最短的十进制表示,可以唯一标识该值与相同类型的其他值不同。以前,只有对于float64值才是真的。现在科学表示法中的数组也使用最短的科学表示法,而不是以前的固定精度。

此外,在 python2 中,浮点标量的str不再被截断,与 python3 之间不同。np.double标量现在有一个与 python3 浮点相同的strrepr

提供了新函数np.format_float_scientificnp.format_float_positional来生成这些十进制表示。

np.set_printoptionsnp.array2string中添加了一个新选项floatmode,它可以控制数组中打印元素的唯一性和舍入。新的默认方式是floatmode='maxprec',精度为 8,这样将最多打印 8 位小数,或者如果一个元素可以被较少的位数唯一表示,则打印更少。一个有用的新模式是floatmode="unique",它将输出足够的位数来唯一指定数组元素。

inf*jnan*j这样的 Numpy 复杂浮点标量现在以infjnanj打印,就像纯 pythoncomplex类型一样。

FloatFormatLongFloatFormat类已经被弃用,应该都被FloatingFormat替换。同样,ComplexFormatLongComplexFormat应该被替换为ComplexFloatingFormat

void数据类型元素现在以十六进制表示

与 python bytes类型兼容的十六进制表示现在可以用于非结构化np.void元素,例如,V4数据类型。在 python2 中,元素的原始 void 数据会打印到 stdout,或者在 python3 中,整数字节值会显示。

void数据类型的打印样式现在可以独立自定义

np.void数组的打印样式现在可以独立使用np.set_printoptionsformatter参数进行自定义,而不是以前的numpystr键。

减少了np.loadtxt的内存使用

np.loadtxt现在分批次读取文件,而不是一次性读取,这显著减少了它对大文件的内存使用。

random.noncentral_f中,分子自由度只需要是正的。

在 NumPy 1.14.0 之前,分子自由度需要大于 1,但分布对大于 0 的值有效,这是新的要求。

所有np.einsum变体都释放了 GIL

在 NumPy 1.14.0 之前,一些具有加速循环版本的特定循环结构在释放 GIL 之前不会释放。这个疏忽已经修复。

np.einsum函数在可能的情况下将使用 BLAS,并默认进行优化

当合适时,np.einsum 函数现在将调用 np.tensordot。由于 np.tensordot 可以在可能的情况下使用 BLAS,因此将加快执行速度。默认情况下,np.einsum 还会尝试优化,因为开销相对较小,相对于速度的潜在提升来说。

f2py 现在可以处理零维数组

f2py 现在允许分配零维数组。这样可以更一致地处理下游的边缘情况。

numpy.distutils 支持同时使用 MSVC 和 mingw64-gfortran

Numpy distutils 现可同时使用 Mingw64 gfortran 和 MSVC 编译器。这样可以在 Windows 上生产包含 Fortran 代码的 Python 扩展模块,同时保留与 Python.org 发行的二进制文件的兼容性。不支持所有用例,但大多数用于在 Python 中包装 Fortran 的常见方式是有效的。

在这种模式下通常会自动启用编译,并可以通过 setup.py--fcompiler--compiler 选项进行选择。此外,支持将 Fortran 代码链接到静态 OpenBLAS;默认情况下会查找 gfortran 兼容的静态存档 openblas.a

np.linalg.pinv 现在可用于堆叠矩阵

以前仅限于单个二维数组。

numpy.save 将数据对齐到 64 字节,而不是 16

使用 numpy.save 将 NumPy 数组保存为 npy 格式会在数组数据之前插入填充,以使其对齐到 64 字节。以前只有 16 字节(由于版本 2 中的代码中存在错误,有时会更少)。现在对齐是 64 字节,与常见的 SIMD 指令集相匹配,并且也是最常见的缓存行大小。这使得在程序上使用 mmap 打开它们更容易,特别是在 Linux 上,其中 mmap 偏移量必须是页面大小的倍数。

现在可以在不使用临时文件的情况下写入 NPZ 文件

在 Python 3.6+ 中,numpy.saveznumpy.savez_compressed 现在直接写入 ZIP 文件,而不创建中间临时文件。

更好地支持空结构化和字符串类型

结构化类型可以不包含任何字段,字符串数据类型可以不包含任何字符。仍然无法直接创建长度为零的字符串,必须通过结构化数据类型构建:

str0 = np.empty(10, np.dtype([('v', str, N)]))['v']
void0 = np.empty(10, np.void) 

以前总是可以处理这些,但现在为这些数组支持以下操作:

  • arr.sort()
  • arr.view(bytes)
  • arr.resize(…)
  • pickle.dumps(arr)

np.lib.financial 中支持 decimal.Decimal

除非另有说明,financial 包中的所有函数现在都支持使用内置类型 decimal.Decimal

浮点数打印现在使用“dragon4”算法进行最短十进制表示

浮点值(16、32、64 和 128 位)的 strrepr 现在被打印为给出最短的十进制表示唯一标识该值与相同类型的其他值的值。以前这仅对 float64 值成立。剩余的浮点类型现在通常会比 numpy 1.13 中更短。以科学计数法打印的数组现在也使用最短的科学表示形式,而不是之前的固定精度。

此外,在 python2 中,浮点标量的 str 不再被截断,不像 python2 中的 float。现在,np.double 标量的 strrepr 与 python3 中的 float 完全相同。

新的函数 np.format_float_scientificnp.format_float_positional 已经提供用于生成这些十进制表示。

np.set_printoptionsnp.array2string 现在添加了一个新选项 floatmode,用于控制数组中打印元素的唯一性和四舍五入。新的默认值是 floatmode='maxprec',精度为 8,将最多打印 8 位小数,或者更少如果一个元素可以用更少的位数唯一表示。一个有用的新模式是 floatmode="unique",它将输出足够位数以唯一指定数组元素。

Numpy 复合浮点标量的值,例如 inf*jnan*j,现在打印为infjnanj,类似于纯 Python complex 类型。

FloatFormatLongFloatFormat 类已被弃用,应该都替换为 FloatingFormat。类似地,ComplexFormatLongComplexFormat 应该被替换为 ComplexFloatingFormat

void 数据类型元素现在以十六进制表示打印。

现在对于非结构化的 np.void 元素(例如 V4 数据类型),会打印与 Python bytes 类型兼容的十六进制表示。以前,在 python2 中,元素的原始 void 数据会打印到 stdout,或者在 python3 中会显示整数字节值。

void 数据类型的打印样式现在可以独立自定义

使用 np.set_printoptionsformatter 参数,现在可以独立自定义 np.void 数组的打印样式,使用 'void' 键,而不像以前的 numpystr 键。

减少了 np.loadtxt 的内存使用。

np.loadtxt 现在逐块读取文件而不是一次性读取,这显著减少了大文件的内存使用。

变更

结构化数组的多字段索引/赋值

具有多个字段的结构化数组的索引和赋值在许多方面已经发生了变化,正如之前发布时警告的那样。

首先,对具有多个字段的结构化数组进行索引,例如 arr[['f1', 'f3']],会返回原始数组的视图而不是副本。返回的视图会有额外的填充字节对应于原始数组中的插入字段,不像 1.13 中的副本那样,这将会影响 arr[['f1', 'f3']].view(newdtype) 这样的代码。

其次,结构化数组之间的赋值现在将“按位置”而不是“按字段名”进行。目标的第 N 个字段将设置为源的第 N 个字段,而不管字段名如何,与 numpy 版本 1.6 到 1.13 中在目标数组中设置字段不同,这些字段设置为源数组中的同名字段,或者如果源没有字段,则设置为 0。

相应地,当计算 dtype 相等性时,结构化 dtype 中字段的顺序现在很重要。例如,对于 dtype

x = dtype({'names': ['A', 'B'], 'formats': ['i4', 'f4'], 'offsets': [0, 4]})
y = dtype({'names': ['B', 'A'], 'formats': ['f4', 'i4'], 'offsets': [4, 0]}) 

表达式x == y现在将返回False,与以前不同。这使得基于字典的 dtype 规范(如dtype({'a': ('i4', 0), 'b': ('f4', 4)}))在 Python < 3.6 中变得危险,因为在这些版本中不保留字典键的顺序。

从结构化数组到布尔数组的赋值现在会引发 ValueError,与 1.13 中不同,那时它总是将目标元素设置为True

从具有多个字段的结构化数组到非结构化数组的赋值现在会引发 ValueError。在 1.13 中,这仅复制源的第一个字段到目标。

不允许在多字段索引中使用字段“标题”,也不允许在多字段索引中重复字段名。

用户指南中关于结构化数组的文档已经进行了显著更新,以反映这些变化。

整数和 Void 标量现在不受np.set_string_function的影响。

以前,与大多数其他 numpy 标量不同,整数和 Void 标量的strrepr可以由np.set_string_function控制。这已不再可能。

0 维数组打印已更改,已弃用 array2string 的 style 参数。

以前,0 维数组的strrepr具有特殊的实现,分别返回str(a.item())'array(' + repr(a.item()) + ')',对于 0 维数组a,与 numpy 标量和更高维度的 ndarray 不同。

现在,0 维数组的str的行为类似于使用str(a[()])的 numpy 标量,而repr的行为类似于使用formatter(a[()])的更高维数组,其中formatter可以使用np.set_printoptions指定。np.array2stringstyle参数已弃用。

此新行为在 1.13 遗留打印模式中已禁用,请参见上述兼容性说明。

使用数组对RandomState进行种子设置需要一个一维数组。

RandomState以前将接受空数组或数组维度为 2 或更多的数组,这导致无法进行种子设置(空数组)或在设置种子时忽略一些传递的值。

MaskedArray对象显示更有用的repr

MaskedArrayrepr现在更接近于生成它的 python 代码,现在用逗号和 dtype 显示数组。与其他格式更改一样,可以通过 1.13 遗留打印模式来禁用此功能,以帮助过渡 doctests。

np.polynomial类的repr更加明确。

现在,它将域和窗口参数显示为关键字参数,以使它们更清晰:

>>> np.polynomial.Polynomial(range(4))
Polynomial([0.,  1.,  2.,  3.], domain=[-1,  1], window=[-1,  1]) 

结构化数组的多字段索引/分配

结构化数组的多字段索引和分配在许多方面已经发生了变化,如之前版本中所警告的那样。

首先,使用多个字段对结构化数组进行索引,例如,arr[['f1', 'f3']],返回的是原始数组的视图而不是副本。返回的视图将具有原始数组中介入字段对应的额外填充字节,与 1.13 版本中的副本不同,这将影响到如arr[['f1', 'f3']].view(newdtype)的代码。

其次,现在在结构化数组之间进行分配将会“按位置”而不是“按字段名”进行。目标的第 N 个字段将设置为源的第 N 个字段,而不管字段名,与 numpy 版本 1.6 到 1.13 中,在目标数组中将字段设置为源数组中的同名字段或者如果源没有字段则设置为 0 的情况不同。

相应地,在计算 dtype 相等性时,结构化 dtype 中字段的顺序现在很重要。例如,对于 dtypes

x = dtype({'names': ['A', 'B'], 'formats': ['i4', 'f4'], 'offsets': [0, 4]})
y = dtype({'names': ['B', 'A'], 'formats': ['f4', 'i4'], 'offsets': [4, 0]}) 

表达式x == y现在会返回False,与以前不同。这使得在 python < 3.6 中基于字典的 dtype 规范(如dtype({'a': ('i4', 0), 'b': ('f4', 4)}))是危险的,因为这些版本中不保留字典键顺序。

从结构化数组分配到布尔数组现在引发 ValueError,与 1.13 版本不同,1.13 版本总是将目标元素设置为True

从具有多个字段的结构化数组分配到非结构化数组现在会引发 ValueError。在 1.13 版本中,仅复制了源数组的第一个字段到目标数组。

禁止在多字段索引中使用字段“titles”,也禁止在多字段索引中重复字段名。

用户指南中关于结构化数组的文档已经显著更新以反映这些更改。

整数和 Void 标量现在不受np.set_string_function的影响。

之前,与大多数其他 numpy 标量不同,整数和 Void 标量的strrepr可以通过np.set_string_function来控制。现在不再可能。

0 维数组打印已更改,已弃用 array2string 的 style(arg)

以前,0 维数组的strrepr有着独特的实现,分别对于 0 维数组a返回str(a.item())'array(' + repr(a.item()) + ')',与 numpy 标量和更高维度 ndarrays 不同。

现在,0 维数组的str操作类似于使用str(a[()])的 numpy 标量,并且repr操作类似于使用formatter(a[()])的更高维度数组,其中formatter可以使用np.set_printoptions来指定。np.array2stringstyle参数已经弃用。

这种新行为在 1.13 版本的遗留打印模式中被禁用,请参考上面的兼容性注意事项。

使用数组对RandomState进行种子化现在需要一个 1 维数组。

之前,RandomState将接受空数组或具有 2 个或更多维度的数组,这导致无法设置种子(空数组)或在设置种子时忽略一些传递的值。

MaskedArray对象显示更有用的repr

MaskedArrayrepr现在更接近于生成它的 Python 代码,数组现在以逗号和数据类型显示。与其他格式更改一样,可以通过 1.13 版本的遗留打印模式禁用此功能,以帮助过渡 doctests。

np.polynomial类的repr更加明确

现在显示域和窗口参数作为关键字参数,以使它们更清晰:

>>> np.polynomial.Polynomial(range(4))
Polynomial([0.,  1.,  2.,  3.], domain=[-1,  1], window=[-1,  1]) 

NumPy 1.13.3 发布说明

原文:numpy.org/doc/1.26/release/1.13.3-notes.html

这是一个针对 1.13.1 以来发现的一些问题的 bug 修复版本。最重要的修复针对的是 CVE-2017-12852 和临时省略。1.13 之前的版本的用户应该升级。

支持的 Python 版本是 2.7 和 3.4 - 3.6。PIP 提供的 Python 3.6 版本与之前的所有 Python 3.6 版本兼容,其版本是 Python 3.6.2。它使用 Cython 0.26.1 进行了 cython 化,在不引入 0.27 中的错误的同时还与 Python 3.7-dev 兼容。Windows 版本使用 OpenBlas 而不是 ATLAS 构建,应该能提高线性代数函数的性能。

NumPy 1.13.3 发布是 1.13.2 的重新发布,因为 1.13.2 在 Cython 0.27.0 中有一个 bug。

贡献者

本次发布共有 12 人做出了贡献。名字后面带有“+”的人是第一次贡献修补程序。

  • Allan Haldane

  • Brandon Carter

  • Charles Harris

  • Eric Wieser

  • Iryna Shcherbina +

  • James Bourbeau +

  • Jonathan Helmus

  • Julian Taylor

  • Matti Picus

  • Michael Lamparski +

  • Michael Seifert

  • Ralf Gommers

合并的拉取请求

本次发布共合并了 22 个拉取请求。

  • 9390 BUG: 直接返回 poly1d 系数数组

  • 9555 BUG: 在 1.13.x 版本的 distutils.mingw32ccompiler 中修复回归问题。

  • 9556 BUG: 在指定 dtype=np.float64 时修复 true_divide。

  • 9557 DOC: 修复了 numpy/doc/basics.py 中的一些 rst 标记。

  • 9558 BLD: 从 IntelFCompiler 中删除 -xhost 标志。

  • 9559 DOC: 移除损坏的 docstring 示例(源代码,png,pdf)…

  • 9580 BUG: 将 hypot 和 cabs 函数添加到 WIN32 黑名单。

  • 9732 BUG: 使标量函数省略检查临时可写。

  • 9736 BUG: 对 np.gradient 进行各种修复

  • 9742 BUG: 为 CVE-2017-12852 修复了 np.pad

  • 9744 BUG: 检查排序函数中的异常,添加测试

  • 9745 DOC: 在“versionadded::”指令后添加空格,以便真正…

  • 9746 BUG: 大小为 0 的 np.dot 中的内存泄漏

  • 9747 BUG: 调整 gfortran 版本搜索正则表达式

  • 9757 BUG: Cython 0.27 在 Python 3 上破坏了 NumPy。

  • 9764 BUG: 当需要时,确保 _npy_scaled_cexp{,f,l} 被定义。

  • 9765 BUG: PyArray_CountNonzero 不检查异常

  • 9766 BUG: 修复了无符号 bin 值的直方图单调性检查

  • 9767 BUG: 确保 count_nonzero 的一致结果的数据类型

  • 9771 BUG: MAINT: 为 Cython 0.27 修复 mtrand。

  • 9772 DOC: 创建 1.13.2 版本的发行说明。

  • 9794 DOC: 创建 1.13.3 版本的发行说明。

贡献者

本次发布共有 12 人做出了贡献。名字后面带有“+”的人是第一次贡献修补程序。

  • Allan Haldane

  • Brandon Carter

  • Charles Harris

  • Eric Wieser

  • Iryna Shcherbina +

  • James Bourbeau +

  • Jonathan Helmus

  • Julian Taylor

  • Matti Picus

  • Michael Lamparski +

  • Michael Seifert

  • Ralf Gommers

合并的拉取请求

本次发布共合并了 22 个拉取请求。

  • 9390 BUG: 直接返回 poly1d 系数数组

  • 9555 BUG: 修复 distutils.mingw32ccompiler 中 1.13.x 中的回归。

  • 9556 BUG: 当指定 dtype=np.float64 时修复 true_divide。

  • 9557 DOC: 修复 numpy/doc/basics.py 中的一些 rst 标记。

  • 9558 BLD: 从 IntelFCompiler 中删除 -xhost 标志。

  • 9559 DOC: 删除损坏的文档字符串示例(源代码、png、pdf)……

  • 9580 BUG: 将 hypot 和 cabs 函数添加到 WIN32 黑名单中。

  • 9732 BUG: 使标量函数省略检查临时是否可写。

  • 9736 BUG: 对 np.gradient 进行各种修复。

  • 9742 BUG: 修复 np.pad 中的 CVE-2017-12852。

  • 9744 BUG: 在排序函数中检查异常,并添加测试。

  • 9745 DOC: 在“versionadded::”指令后添加空白,以便实际……

  • 9746 BUG: 大小为 0 的 np.dot 存在内存泄漏。

  • 9747 BUG: 调整 gfortran 版本搜索正则表达式。

  • 9757 BUG: Cython 0.27 在 Python 3 上破坏 NumPy。

  • 9764 BUG: 在需要时确保 _npy_scaled_cexp{,f,l} 被定义。

  • 9765 BUG: PyArray_CountNonzero 没有检查异常

  • 9766 BUG: 修复无符号 bin 值的直方图单调性检查。

  • 9767 BUG: 确保 count_nonzero 的结果 dtype 一致。

  • 9771 BUG: MAINT: 修复 Cython 0.27 中的 mtrand。

  • 9772 DOC: 创建 1.13.2 发行说明。

  • 9794 DOC: 创建 1.13.3 发行说明。

NumPy 1.13.2 版本说明

原文:numpy.org/doc/1.26/release/1.13.2-notes.html

这是一个 bug 修复版本,修复了自 1.13.1 以来发现的一些问题。最重要的修复是针对 CVE-2017-12852 和临时省略。1.13 早期版本的用户应该升级。

支持的 Python 版本为 2.7 和 3.4 - 3.6。PIP 提供的 Python 3.6 wheels 是使用 Python 3.6.2 构建的,应该与所有先前版本的 Python 3.6 兼容。Windows 版的 wheels 现在使用 OpenBlas 而不是 ATLAS 构建,这应该改善线性代数函数的性能。

贡献者

总共有 12 人贡献了这个版本。+ 号表示第一次贡献补丁的人。

  • Allan Haldane

  • Brandon Carter

  • Charles Harris

  • Eric Wieser

  • Iryna Shcherbina +

  • James Bourbeau +

  • Jonathan Helmus

  • Julian Taylor

  • Matti Picus

  • Michael Lamparski +

  • Michael Seifert

  • Ralf Gommers

合并的拉取请求

总共有 20 个拉取请求被合并了。

  • 9390 BUG: 直接返回 poly1d 系数数组

  • 9555 BUG: 修复了 1.13.x 中 distutils.mingw32ccompiler 的回归

  • 9556 BUG: 当 dtype=np.float64 指定时修复 true_divide。

  • 9557 DOC: 修复了 numpy/doc/basics.py 中一些 rst 标记

  • 9558 BLD: 从 IntelFCompiler 中移除 -xhost 标志

  • 9559 DOC: 删除了损坏的文档示例(源代码,png,pdf)…

  • 9580 BUG: 将 hypot 和 cabs 函数添加到 WIN32 黑名单。

  • 9732 BUG: 使标量函数省略检查 temp 是否可写。

  • 9736 BUG: 对 np.gradient 做了各种修复

  • 9742 BUG: 修复了 CVE-2017-12852 的 np.pad

  • 9744 BUG: 检查排序函数中是否存在异常,并添加测试

  • 9745 DOC: 在 "versionadded::" 指令后添加空格,这样它就真的…

  • 9746 BUG: 大小为 0 的 np.dot 存在内存泄漏

  • 9747 BUG: 调整 gfortran 版本搜索正则表达式

  • 9757 BUG: Cython 0.27 打破了 Python 3 上的 NumPy。

  • 9764 BUG: 确保 _npy_scaled_cexp{,f,l} 在需要时被定义。

  • 9765 BUG: PyArray_CountNonzero 没有检查异常

  • 9766 BUG: 修复了无符号 bin 值的直方图单调性检查

  • 9767 BUG: 确保 count_nonzero 的一致结果 dtype

  • 9771 BUG, MAINT: 修复了 Cython 0.27 的 mtrand。

贡献者

总共有 12 人贡献了这个版本。+ 号表示第一次贡献补丁的人。

  • Allan Haldane

  • Brandon Carter

  • Charles Harris

  • Eric Wieser

  • Iryna Shcherbina +

  • James Bourbeau +

  • Jonathan Helmus

  • Julian Taylor

  • Matti Picus

  • Michael Lamparski +

  • Michael Seifert

  • Ralf Gommers

合并的拉取请求

总共有 20 个拉取请求被合并了。

  • 9390 BUG: 直接返回 poly1d 系数数组

  • 9555 BUG: 修复了 1.13.x 中 distutils.mingw32ccompiler 的回归

  • 9556 BUG: 当 dtype=np.float64 指定时修复 true_divide。

  • 9557 DOC: 修复了 numpy/doc/basics.py 中一些 rst 标记

  • 9558 BLD: 从 IntelFCompiler 中移除 -xhost 标志

  • 9559 DOC: 删除了 numpy/doc/basics.py 中一些损坏的 rst 标记

  • 9580 BUG:将 hypot 和 cabs 函数添加到 WIN32 黑名单

  • 9732 BUG:使标量函数省略检查临时对象是否可写

  • 9736 BUG:对 np.gradient 进行了各种修复

  • 9742 BUG:为 CVE-2017-12852 修复 np.pad

  • 9744 BUG:在排序函数中检查异常,添加测试

  • 9745 DOC:在“versionadded::”指令后添加空格,使其生效…

  • 9746 BUG:np.dot 在大小为 0 时出现内存泄漏

  • 9747 BUG:调整 gfortran 版本搜索正则表达式

  • 9757 BUG:Cython 0.27 在 Python 3 上破坏 NumPy

  • 9764 BUG:在需要时确保_npy_scaled_cexp{,f,l}已定义

  • 9765 BUG:PyArray_CountNonzero 没有检查异常

  • 9766 BUG:修复无符号 bin 值的直方图单调性检查

  • 9767 BUG:确保 count_nonzero 的一致结果 dtype

  • 9771 BUG, MAINT:为 Cython 0.27 修复 mtrand

NumPy 1.13.1 发布说明

原文:numpy.org/doc/1.26/release/1.13.1-notes.html

这是一个为解决 1.13.0 版本中出现的问题的 bug 修复版本。主要变化是修复了新的内存重叠检测和临时削减以及撤消了布尔二进制 - 运算符的移除。1.13.0 的用户应该升级。

受支持的 Python 版本为 2.7 和 3.4 - 3.6。请注意,PIP 上可用的 Python 3.6 轮子是针对 3.6.1 构建的,因此在 3.6.0 上使用时将无法工作,因为 Python bug 29943。NumPy 1.13.2 将在 Python 3.6.2 发布后不久发布以解决该问题。如果您正在使用 3.6.0 版本,则可以升级到 3.6.1 版本,或者使用早期的 Python 版本进行解决。

合并的拉取请求

共有 19 个拉取请求合并到了本次发布中。

  • 9240 DOC: BLD: 修复了许多 Sphinx 警告/错误。

  • 9255 撤销 “DEP:引用 subtract(bool,bool) 的 TypeError。”

  • 9261 BUG: 不将只读和更新副本临时变量压缩到...

  • 9262 BUG: 修复 numpy.f2py 中共同块的缺少关键字重命名

  • 9263 BUG: 处理零维数组的调整大小

  • 9267 DOC: 更新 f2py 首页和一些文档构建元数据。

  • 9299 BUG: 修复 Unix 上的 Intel 编译。

  • 9317 BUG: 修复 empty where 检查中使用的错误 ndim

  • 9319 BUG: 使扩展在 MinGW 上的 Py2.7 中可编译

  • 9339 BUG: 防止 ufunc 文档字符串为空时崩溃

  • 9340 BUG: umath: 修复没有给出 out= 时 ufunc where 的错误

  • 9371 DOC: 在文档中添加 isnat/positive ufunc

  • 9372 BUG: 修复 numpy.core.records 中 fromstring 函数的错误...

  • 9373 BUG: 指针结束处在 numpy.f2py 缓冲区中打印了“)”。

  • 9374 DOC: 创建 NumPy 1.13.1 发布说明。

  • 9376 BUG: 防止遍历 ufunc userloop 链接列表时卡住

  • 9377 DOC: 在 heaviside docstring 中使用 x1 和 x2。

  • 9378 DOC: 在 isnat 文档字符串中添加 $PARAMS

  • 9379 DOC: 更新 1.13.1 发布说明

贡献者

一共有 12 人为本次发布做出了贡献。名字后面带有“+”符号的人第一次贡献了补丁。

  • Andras Deak +

  • Bob Eldering +

  • Charles Harris

  • Daniel Hrisca +

  • Eric Wieser

  • Joshua Leahy +

  • Julian Taylor

  • Michael Seifert

  • Pauli Virtanen

  • Ralf Gommers

  • Roland Kaufmann

  • Warren Weckesser

合并的拉取请求

共有 19 个拉取请求合并到了本次发布中。

  • 9240 DOC: BLD: 修复了许多 Sphinx 警告/错误。

  • 9255 撤销 “DEP:引用 subtract(bool,bool) 的 TypeError。”

  • 9261 BUG: 不将只读和更新副本临时变量压缩到...

  • 9262 BUG: 修复 numpy.f2py 中共同块的缺少关键字重命名

  • 9263 BUG: 处理零维数组的调整大小

  • 9267 DOC: 更新 f2py 首页和一些文档构建元数据。

  • 9299 BUG: 修复 Unix 上的 Intel 编译。

  • 9317 BUG: 修复 empty where 检查中错误地使用的 ndim。

  • 9319 BUG: 使扩展在 MinGW 上的 Py2.7 中可编译

  • 9339 BUG: 防止 ufunc 文档字符串为空时崩溃

  • 9340 BUG: umath: 修复没有给出 out= 时 ufunc where 的错误

  • 9371 DOC: 在文档中添加 isnat/positive ufunc

  • 9372 BUG: 修复 numpy.core.records 中 fromstring 函数的错误…

  • 9373 BUG: numpy.f2py 中缓冲区末尾打印‘)’

  • 9374 DOC: 创建 NumPy 1.13.1 发布说明。

  • 9376 BUG: 防止遍历 ufunc userloop 链接列表时出现挂起

  • 9377 DOC: 在 heaviside 文档字符串中使用 x1 和 x2。

  • 9378 DOC: 在 isnat 文档字符串中添加$PARAMS

  • 9379 DOC: 更新 1.13.1 发布说明

贡献者

这个版本共有 12 人贡献。名字后面有“+”符号的人是第一次贡献补丁。

  • Andras Deak +

  • Bob Eldering +

  • Charles Harris

  • Daniel Hrisca +

  • Eric Wieser

  • Joshua Leahy +

  • Julian Taylor

  • Michael Seifert

  • Pauli Virtanen

  • Ralf Gommers

  • Roland Kaufmann

  • Warren Weckesser

NumPy 1.13.0 发布说明

原文:numpy.org/doc/1.26/release/1.13.0-notes.html

该版本支持 Python 2.7 和 3.4 - 3.6。

重点

  • 在一些平台上,类似 a + b + c 的操作将重用临时空间,从而减少内存使用和加快执行速度。
  • 就地操作检查输入是否与输出重叠,并创建临时变量以避免问题。
  • 新增 __array_ufunc__ 属性,提供了对类以覆盖默认 ufunc 行为的改进能力。
  • 新增 np.block 函数,用于创建阻塞数组。

新函数

  • 新增 np.positive ufunc。

  • 新的 np.divmod ufunc 提供更有效的 divmod 操作。

  • 新的 np.isnat ufunc 用于测试 NaT 特殊值。

  • 新增 np.heaviside ufunc 用于计算 Heaviside 函数。

  • 新增 np.isin 函数,改进了 in1d

  • 新增 np.block 函数,用于创建阻塞数组。

  • 新增到 NumPy C-API 的 PyArray_MapIterArrayCopyIfOverlap

详情请参见下文。

弃用功能

  • 使用 f(x, y=out) 方式调用 np.fixnp.isposinfnp.isneginf 已被弃用 - 参数应该以 f(x, out=out) 的方式传递,这与其他类似 ufunc 的接口相匹配。

  • 使用 C-API NPY_CHAR 类型数字自 1.7 版本以来已被弃用,现在会在运行时引发弃用警告。使用旧版 f2py 构建的扩展需要重新编译以消除警告。

  • np.ma.argsortnp.ma.minimum.reducenp.ma.maximum.reduce 在应用于超过两个维度的数组时,应该显式调用 axis 参数,因为此参数的默认值 (None) 与 numpy 的其他部分不一致 (-1, 00)。

  • np.ma.MaskedArray.mini 已被弃用,因为它几乎与 np.MaskedArray.min 的功能重复。可以通过 np.ma.minimum.reduce 来完全获得相同的行为。

  • 已弃用 np.ma.minimumnp.ma.maximum 的单参数形式。现在应该这样写 np.ma.minimum.reduce(x),这与 np.minimum 的用法一致。

  • 调用非数值数据类型的 ndarray.conjugate 已被弃用(应与 np.conjugate 的行为一致,后者会引发错误)。

  • 调用 expand_dims 时,如果 axis 关键字不满足 -a.ndim - 1 <= axis <= a.ndim 的条件,将会被弃用。

未来更改

  • 在 NumPy 1.14 中,具有不同字段名称的结构化数组之间的赋值将发生改变。

构建系统更改

  • numpy.distutils 现在可以使用 GCC 兼容的编译器自动确定 C 文件的依赖关系。

兼容性注意事项

错误类型更改

  • 当输入为空时,numpy.hstack()现在会抛出ValueError而不是IndexError

  • 传递轴参数的函数,当该参数超出范围时,现在会抛出np.AxisError而不是一个IndexErrorValueError混合的情况。为了向后兼容,AxisError子类化了这两种异常。

元组对象 dtypes

一些意外允许的某些不常见的 dtypes(形式为(old_dtype, new_dtype))的支持已经被移除,其中任一 dtype 是或包含object dtype。作为一个例外,由于已有使用证据,仍然支持形式为(object, [('name', object)])的 dtypes。

DeprecationWarning 变为错误

详情请查看变更章节。

  • partition,使用非整数分区索引时会产生 TypeError。

  • NpyIter_AdvancedNewoa_ndim == 0并且op_axes为空时会产生 ValueError

  • negative(bool_)对布尔值应用 negative 时会产生 TypeError。

  • subtract(bool_, bool_),从布尔值中减去布尔值会产生 TypeError。

  • np.equal, np.not_equal,对象身份不覆盖失败的比较。

  • np.equal, np.not_equal,对象身份不覆盖非布尔比较。

  • 已弃用的布尔索引行为已删除。详细信息请查看下面的变更。

  • 已弃用的np.alterdot()np.restoredot()已移除。

FutureWarning 变化的行为

详情请查看变更章节。

  • numpy.average保留子类

  • array == Nonearray != None进行逐元素比较。

  • np.equal, np.not_equal,对象身份不覆盖比较结果。

现在 dtypes 始终为 true

以前,bool(dtype)将退回到默认的 Python 实现,即检查len(dtype) > 0。由于dtype对象实现__len__作为记录字段的数量,标量 dtypes 的bool将评估为False,这是不直观的。现在对于所有 dtypes,bool(dtype)==True

ndarray子类中已不再需要__getslice____setslice__

在 Python 2.7 中,当对 np.ndarray 进行子类化时,不再需要在派生类上实现__*slice__,因为__*item__将正确拦截这些调用。

任何实现这些的代码将与以前完全相同。调用ndarray.__getslice__(例如通过super(...).__getslice__)现在将发出 DeprecationWarning - .__getitem__(slice(start, end))应该被代替使用。

使用...(省略号)对 MaskedArrays/Constants 进行索引现在将返回 MaskedArray

此行为反映了 np.ndarray 的行为,并考虑了 object dtype 的 MaskedArrays 中的嵌套数组,以及与其他形式的索引结合使用的省略号。

C API 变更

空数组和 NpyIter 轴删除的 GUfuncs

现在允许从 NpyIter 中删除大小为零的轴。这可能意味着从 NpyIter 中删除轴的代码在以后访问已删除的维度时必须添加额外的检查。

最大的后续更改是 gufunc 现在允许具有大小为零的内部维度。这意味着 gufunc 现在必须预料到一个空的内部维度,而这以前是不可能的,会引发错误。

对于大多数 gufuncs,通常不需要进行任何更改。但是,如果 gufunc 的签名为(..., N, M) -> (..., M),并且在N=0的情况下可以返回有效结果而无需进一步的包装代码。

在 NumPy C-API 中添加了PyArray_MapIterArrayCopyIfOverlap

类似于PyArray_MapIterArray,但有一个额外的copy_if_overlap参数。如果copy_if_overlap != 0,则检查输入与其他数组是否存在内存重叠,并适当复制以避免在迭代期间修改输入时出现问题。有关更完整的文档,请参阅文档。

新特性

添加了__array_ufunc__

这是重新命名和重新设计的__numpy_ufunc__。任何类,无论是否是 ndarray 子类,都可以定义此方法或将其设置为None,以覆盖 NumPy 的 ufunc 行为。这与 Python 的__mul__和其他二进制操作例程非常相似。有关此新选项实现和行为的更详细描述,请参阅文档。API 是临时的,我们还不能保证向后兼容性,因为可能会根据反馈做出修改。有关更多详细信息,请参阅NEP 13文档

新的positive ufunc

这个 ufunc 对应于一元的+,但与 ndarray 上的+不同,如果数组值不支持数值运算,它将引发错误。

新的divmod ufunc

这个 ufunc 对应于 Python 内置的divmod,用于在 numpy 数组上调用divmod时。np.divmod(x, y)计算的结果相当于(np.floor_divide(x, y), np.remainder(x, y)),但调用这两个函数的速度大约快两倍。

np.isnat ufunc 测试特殊的 NaT 日期时间和时间差值数值

新的 ufunc np.isnat在日期时间和时间差值数组中查找特殊的 NaT 数值的位置。这类似于np.isnan

np.heaviside ufunc 计算 Heaviside 函数

新的函数np.heaviside(x, h0)(一个 ufunc)计算 Heaviside 函数:

 { 0   if x < 0,
heaviside(x, h0) = { h0  if x == 0,
                   { 1   if x > 0. 

用于创建块状数组的np.block函数

在当前的堆叠函数vstackhstackstack中添加一个新的block函数。这允许同时跨多个轴进行连接,具有类似于数组创建的语法,但其中的元素本身可以是数组。例如:

>>> A = np.eye(2) * 2
>>> B = np.eye(3) * 3
>>> np.block([
...     [A,               np.zeros((2, 3))],
...     [np.ones((3, 2)), B               ]
... ])
array([[ 2.,  0.,  0.,  0.,  0.],
 [ 0.,  2.,  0.,  0.,  0.],
 [ 1.,  1.,  3.,  0.,  0.],
 [ 1.,  1.,  0.,  3.,  0.],
 [ 1.,  1.,  0.,  0.,  3.]]) 

虽然主要用于块矩阵,但对数组的任意维度都适用。

它类似于 Matlab 的方括号表示法用于创建块矩阵。

isin函数,对in1d进行改进

新的函数isin测试 N 维数组的每个元素是否存在于第二个数组中的任何位置。这是对in1d的增强,它保留了第一个数组的形状。

临时省略

在提供backtrace函数的平台上,NumPy 将尝试避免在涉及基本数值类型的表达式中创建临时变量。例如d = a + b + c被转换为d = a + b; d += c,这可以提高大数组的性能,因为执行操作需要更少的内存带宽。

uniqueaxes参数

在 N 维数组中,用户现在可以选择沿着哪个轴寻找重复的 N-1 维元素,使用numpy.unique。如果axis=None(默认),则恢复原始行为。

np.gradient现在支持不均匀间距的数据。

用户现在可以为数据指定非恒定的间距。特别是np.gradient现在可以接受:

  1. 使用单个标量来指定所有维度的采样距离。

  2. 用 N 个标量来指定每个维度的恒定采样间距。例如dxdydz等。

  3. 用 N 个数组来指定 F 的每个维度上的值的坐标。数组的长度必须与相应维度的大小相匹配。

  4. 任意组合的 N 个标量/数组,具有第 2 和第 3 点的含义。

这意味着,例如,现在可以执行以下操作:

>>> f = np.array([[1, 2, 6], [3, 4, 5]], dtype=np.float_)
>>> dx = 2.
>>> y = [1., 1.5, 3.5]
>>> np.gradient(f, dx, y)
[array([[ 1\. ,  1\. , -0.5], [ 1\. ,  1\. , -0.5]]),
 array([[ 2\. ,  2\. ,  2\. ], [ 2\. ,  1.7,  0.5]])] 

apply_along_axis中支持返回任意维度的数组

以前,apply_along_axis传递的函数只能返回标量或 1D 数组。现在,它可以返回任意维度的数组(包括 0 维),并且该数组的形状将替换正在迭代的数组的轴。

.形状属性已添加到dtype以补充.形状

为了与ndarraybroadcast保持一致,d.ndimlen(d.shape)的简写。

对 Python 3.6 的 tracemalloc 的支持

NumPy 现在支持 Python 3.6 或更新版本的tracemalloc模块进行内存跟踪。来自 NumPy 的内存分配被放入由numpy.lib.tracemalloc_domain定义的域中。请注意,NumPy 分配不会显示在早期 Python 版本的tracemalloc中。

NumPy 可能会使用宽松步幅检查调试构建

在启用宽松步幅检查时,在环境中设置 NPY_RELAXED_STRIDES_DEBUG=1 将导致 NumPy 在受影响的步幅中设置为 npy_intp 的最大值,以帮助检测下游项目中对步幅的无效使用。当启用时,无效使用通常会导致错误被引发,但错误类型的具体类型取决于代码的细节。在现实中观察到了 TypeError 和 OverflowError。

以前,该选项在发布版中被禁用,在主分支中被启用,而在两者之间切换需要编辑代码。现在默认情况下禁用,但可以在测试版本中启用。

改进

重叠输入的Ufunc行为

在以前的 NumPy 版本中,Ufunc输入和输出操作数存在内存重叠的操作会产生未定义的结果,因为存在数据依赖性问题。 在 NumPy 1.13.0 中,这类操作的结果现在被定义为与没有内存重叠的等效操作的结果相同。

现在受影响的操作会根据需要制作临时拷贝,以消除数据依赖性。 由于检测这些情况是计算昂贵的,因此使用了启发式方法,这在罕见情况下可能导致不必要的临时拷贝。 对于启发式方法可以分析的数据依赖性简单到足以使临时拷贝的操作,即使数组重叠,也将不制作任何拷贝,如果可以推断不需要拷贝。 例如,np.add(a, b, out=a)将不涉及拷贝。

为了说明以前未定义的操作:

>>> x = np.arange(16).astype(float)
>>> np.add(x[1:], x[:-1], out=x[1:]) 

在 NumPy 1.13.0 中,最后一行保证等同于:

>>> np.add(x[1:].copy(), x[:-1].copy(), out=x[1:]) 

具有简单,无问题数据依赖的类似操作是:

>>> x = np.arange(16).astype(float)
>>> np.add(x[1:], x[:-1], out=x[:-1]) 

它将继续产生与之前 NumPy 版本相同的结果,并且不会涉及不必要的临时拷贝。

此更改也适用于原地二进制操作,例如:

>>> x = np.random.rand(500, 500)
>>> x += x.T 

该语句现在保证等同于x[...] = x + x.T,而在以前的 NumPy 版本中,结果是未定义的。

部分支持使用 MinGW 的 64 位 f2py 扩展

可以使用免费的MinGW工具集构建包含 Fortran 库的扩展,也可以在 Python 3.5 下使用。 这对于只进行计算并适度使用运行时(例如读写文件)的扩展效果最好。 请注意,这并不消除了 Mingwpy 的需要;如果您大量使用运行时,您很可能会遇到问题。 相反,它应该被视为一种应急措施,直到 Mingwpy 能够充分发挥作用。

也可以使用可移动的 WinPython 3.4 分发中的运行时库,使用 MinGW 工具集编译扩展,这对于具有 PySide1/Qt4 前端的程序可能会有用。

packbitsunpackbits的性能改进

函数numpy.packbits与布尔输入和numpy.unpackbits已经被优化为对于连续数据来说更快。

修复了 PPC 长双浮点信息

在以前的 NumPy 版本中,finfo函数返回的longdouble浮点类型的双倍浮点数格式有无效信息。无效值是由于 NumPy 算法无法处理PPC long doubles中变化数量的尾数位数。这个版本通过使用启发式算法来检测 PPC 双倍浮点格式绕过了失败的算法。使用这些启发式算法的一个副作用是finfo函数比以前的版本更快。

更好的ndarray子类的默认 repr

没有repr专业化的 ndarray 子类现在正确地缩进其数据和类型行。

掩码数组的比较更可靠

掩码数组的比较对于掩码标量存在问题,并且对于维度大于 1 的结构化数组是失败的。这两个问题现在都得到解决。在此过程中,确保在获取结构化数组的结果时,正确地忽略掩码字段,即如果两个数组中的所有非掩码字段相等,则结果相等,从而使得行为与通过比较无结构的掩码数组然后在某个轴上进行.all()的行为相同。

np.matrix 现在可以使用字符串语法创建包含布尔元素的矩阵

np.matrix每当尝试与布尔值一起使用时都会失败,例如np.matrix('True')。现在,这可以正常工作。

更多的linalg操作现在接受空向量和矩阵

np.linalg中的所有以下函数现在在给定在最后两个维度中有 0 的输入数组时工作:detslogdetpinveigvalseigvalsheigeigh

捆绑的 LAPACK 版本现在是 3.2.2

NumPy 捆绑了 lapack 的最小实现,供没有安装 lapack 库的系统使用,命名为lapack_lite。这已经从 LAPACK 3.0.0(1999 年 6 月 30 日)升级到 LAPACK 3.2.2(2010 年 6 月 30 日)。有关所有这些变化的详细信息,请参阅LAPACK 更新日志

虽然没有通过numpy公开新功能,但这修复了一些关于“工作空间”大小的错误,并且在某些情况下可能使用更快的算法。

np.hypot.reducenp.logical_xorreduce现在在更多情况下被允许

现在这在空数组上运行,返回 0,并且可以沿多个轴进行缩减。在这些情况下以前会抛出一个ValueError

更好的对象数组repr

包含自身的对象数组不再引起递归错误。

现在以一种明显区分 2D 对象数组和 1D 对象数组的列表的方式打印包含list对象的对象数组。

更改

掩码数组上的argsort采用与sort相同的默认参数

默认情况下,argsort 现在将屏蔽的值放在排序后的数组末尾,就像 sort 已经做的那样。另外,argsort 还添加了 end_with 参数,以保持与 sort 的一致性。请注意,此参数不是添加在最后,因此会破坏将 fill_value 作为位置参数传递的任何代码。

average 现在保留子类

对于子类 ndarray,numpy.average 现在将返回子类的实例,与大多数其他 NumPy 函数(如 mean)的行为匹配。因此,也可能返回子类数组标量的调用现在可能返回一个子类数组标量。

array == Nonearray != None 进行逐元素比较

以前,这些操作分别返回标量 FalseTrue

对于对象数组,np.equal, np.not_equal 忽略对象标识

以前,这些函数总是将相同的对象视为相等。这会覆盖比较失败、对象的比较未返回布尔值(例如 np.arrays)、以及对象的比较结果与对象标识的不同的情况,例如 NaNs。

布尔索引更改

  • 布尔数组型(如 python 布尔列表)始终被视为布尔索引。

  • 布尔标量(包括 python 的 True)是合法的布尔索引,不会被视为整数。

  • 布尔索引必须匹配它们索引的轴的维度。

  • 在赋值的左手边使用布尔索引必须与右手边的维度匹配。

  • 对标量数组进行布尔索引将返回一个新的一维数组。这意味着 array(1)[array(True)] 返回的是 array([1]) 而不是原始数组。

np.random.multivariate_normal 处理不好的协方差矩阵的行为

当处理协方差矩阵时,现在可以通过使用两个新的关键字参数来调整函数的行为:

  • tol 可以用于指定检查协方差矩阵是否为正定时使用的公差。

  • check_valid 可用于配置在存在非正定矩阵时函数的行为。有效选项为 ignorewarnraise。默认值 warn 保持了之前版本的行为。

assert_array_less 现在比较 np.inf-np.inf

以前,np.testing.assert_array_less 忽略了所有无限值。这不符合文档和直观上的预期行为。现在,对于任何实数 x,都会考虑 -inf < x < inf 为 True,所有其他情况失败。

assert_array_ 和屏蔽数组 assert_equal 隐藏了更少的警告

以前被 assert_array_ 函数隐藏的一些警告现在不再隐藏。在大多数情况下,警告应该是正确的,如果发生了这些警告,则需要对使用这些函数的测试进行更改。对于掩码数组 assert_equal 版本,在比较 NaT 时可能会出现警告。该函数目前不专门处理 NaT 或 NaN,因此如果由于此更改而出现警告,最好在此时避免使用它。

memmap 对象中的 offset 属性值

memmap 对象中的 offset 属性现在设置为文件中的偏移量。这仅适用于偏移大于 mmap.ALLOCATIONGRANULARITY 的行为更改。

当标量输入时,np.realnp.imag 返回标量。

以前,当提供标量输入时,np.realnp.imag 用于返回数组对象,这与 np.anglenp.conj 等其他函数不一致。

多项式便利类无法传递给 ufuncs。

从方便类派生的 ABCPolyBase 类将 __array_ufunc__ = None,以便退出 ufuncs。如果将一个多项式便利类实例作为参数传递给一个 ufunc,则现在会引发 TypeError

对于 ufunc 方法,输出参数可以是元组。

对于对 ufuncs 的调用,已经可以并且建议使用一个元组作为多个输出的 ufunc 的输出参数。现在,这已经扩展到 reduceaccumulatereduceat 方法中的输出参数。这主要是为了与 __array_ufunc 兼容;目前还没有超过一个输出的 ufunc。

亮点

  • 在一些平台上,像 a + b + c 的操作将重复使用临时变量,减少内存使用量和更快的执行速度。
  • 立即操作检查输入是否与输出重叠,并创建临时变量以避免问题。
  • 新的 __array_ufunc__ 属性提供了类能够覆盖默认 ufunc 行为的更强大能力。
  • 新的 np.block 函数用于创建分块数组。

新功能

  • 新的 np.positive 函数。

  • 新的 np.divmod 函数提供更高效的 divmod。

  • 新的 np.isnat 函数用于测试 NaT 特殊值。

  • 新的 np.heaviside 函数计算重函数。

  • 新的 np.isin 函数,改进了 in1d

  • 新的 np.block 函数用于创建分块数组。

  • 新增 PyArray_MapIterArrayCopyIfOverlap 到 NumPy C-API。

详情请参见下文。

废弃

  • 使用 f(x, y=out) 调用 np.fixnp.isposinfnp.isneginf 已被废弃 - 参数应该传递为 f(x, out=out),这与其他类似 ufunc 的接口相匹配。

  • 自版本 1.7 起弃用 C-API NPY_CHAR 类型编号,现在将在运行时引发弃用警告。使用旧版本 f2py 构建的扩展需要重新编译以消除警告。

  • 当应用于超过 2 维数组时,np.ma.argsortnp.ma.minimum.reducenp.ma.maximum.reduce应该在调用时使用显式的axis参数,因为这个参数的默认值(None)与 numpy 的其余部分(分别是-100)不一致。

  • np.ma.MaskedArray.mini已被弃用,因为它几乎重复了np.MaskedArray.min的功能。可以通过np.ma.minimum.reduce获得完全等效的行为。

  • 单参数形式的np.ma.minimumnp.ma.maximum已被废弃。 现在应该用np.ma.minimum.reduce(x)来替代np.ma.minimum(x),这与使用np.minimum是一致的。

  • 在非数字数据类型上调用ndarray.conjugate已被弃用(应该与np.conjugate的行为相匹配,该行为会引发错误)。

  • 在重塑数组时,当axis关键字不满足-a.ndim - 1 <= axis <= a.ndim,其中a是数组时,调用expand_dims已被弃用。

未来更改

  • 在 NumPy 1.14 中,将会改变具有不同字段名称的结构化数组之间的赋值。在以前的版本中,目标数组中的字段将设置为源数组中同名字段的值。在 numpy 1.14 中,字段将被按位置分配:目标数组的第 n 个字段将被设置为源数组的第 n 个字段。请注意,在 NumPy 1.12 中引发的FutureWarning错误报告了这个更改被安排在 NumPy 1.13 而不是 NumPy 1.14。

构建系统更改

  • numpy.distutils现在会使用兼容的 GCC 编译器自动确定 C 文件的依赖关系。

兼容性说明

错误类型更改

  • numpy.hstack()现在在输入为空时会抛出ValueError而不是IndexError

  • 当带有超出范围的轴参数时,接受轴参数的函数现在会抛出np.AxisError而不是混合抛出IndexErrorValueError。为了向后兼容,AxisError继承了这两个异常。

元组对象数据类型

已删除对某些意外允许的某些模糊数据类型的支持,例如(old_dtype, new_dtype),其中任一数据类型是或包含object数据类型。作为例外,由于存在使用证据,仍然支持(object, [('name', object)])形式的数据类型。

DeprecationWarning to error

更多详细信息请参阅更改部分。

  • partition,使用非整数分区索引会引发 TypeError。

  • NpyIter_AdvancedNew,当oa_ndim == 0op_axes为空时,会引发 ValueError。

  • negative(bool_),当对布尔数应用负数时,会引发 TypeError。

  • subtract(bool_, bool_),当从布尔数中减去布尔数时,会引发 TypeError。

  • np.equal, np.not_equal,对象标识不重载失败的比较。

  • np.equal, np.not_equal,对象标识不重载非布尔比较。

  • 已弃用布尔索引行为。有关详细信息,请参阅下面的更改。

  • 已删除np.alterdot()np.restoredot()的过时内容。

FutureWarning to changed behavior

更多详细信息请参阅更改部分。

  • numpy.average保留了子类

  • array == Nonearray != None 进行逐个元素比较。

  • np.equal, np.not_equal,对象标识并不会覆盖比较结果。

数据类型现在一直为真。

以前,bool(dtype)会回到默认的 python 实现,即检查len(dtype) > 0。由于dtype对象实现__len__为记录字段的数量,标量数据类型的bool会求值为False,这是不直观的。现在对所有数据类型,bool(dtype) == True

__getslice____setslice__ndarray子类中不再需要。

在 Python 2.7 中,以np.ndarray为基类的子类,不再是在派生类中必须实现__*slice__,因为__*item__会正确拦截这些调用。

任何实现这些功能的代码将与以前完全相同。调用ndarray.__getslice__的代码(例如通过super(...).__getslice__)现在会发出DeprecationWarning,应该使用.__getitem__(slice(start, end))代替。

使用...(省略号)索引MaskedArrays/Constants现在返回MaskedArray

这种行为与np.ndarray相似,并适用于对象数据类型的MaskedArrays中的嵌套数组,以及与其他形式的索引结合使用的省略号。

错误类型更改。

  • numpy.hstack() 现在在输入为空时抛出ValueError,而不是IndexError

  • 当那个轴参数超出范围时,接受轴参数的函数现在会抛出np.AxisError,而不是IndexErrorValueError混合。为了向后兼容,AxisError会继承这两个错误。

元组对象数据类型。

已删除对某些意外允许的模糊数据类型的支持,这些模糊数据类型的形式为(old_dtype, new_dtype),其中任一数据类型为含有object数据类型的object数据类型。作为一个例外,由于存在使用证据,形式为(object, [('name', object)])的数据类型仍然受支持。

废弃警告变为错误。

更多详细信息,请参见更改部分。

  • partition,在使用非整数分区索引时会引发TypeError

  • NpyIter_AdvancedNew,当oa_ndim == 0op_axesNULL时会引发ValueError

  • negative(bool_),当对布尔值应用负数时会引发TypeError

  • subtract(bool_, bool_),当从布尔值中减去布尔值时会引发TypeError

  • np.equal, np.not_equal,对象标识并不会覆盖比较错误。

  • np.equal, np.not_equal,对象标识并不会覆盖非布尔比较。

  • 废弃的布尔索引行为已删除。有关详细信息,请参见下面的更改。

  • 废弃的np.alterdot()np.restoredot()已移除。

未来警告变为更改的行为。

更多详细信息,请参见更改部分。

  • numpy.average 保留子类。

  • array == Nonearray != None 进行逐个元素比较。

  • np.equal, np.not_equal,对象标识并不会覆盖比较结果。

数据类型现在一直为真。

以前,bool(dtype)会回退到默认的 Python 实现,该实现会检查len(dtype) > 0。由于dtype对象将__len__实现为记录字段的数量,标量 dtype 的bool评估为False,这是令人困惑的。现在对于所有 dtype,bool(dtype) == True

ndarray子类中不再需要__getslice____setslice__

在 Python 2.7 中派生 np.ndarray 时,不再需要在派生类上实现__*slice__,因为__*item__将正确拦截这些调用。

实现了这些的任何代码将完全与以前相同。调用ndarray.__getslice__的代码(例如通过super(...).__getslice__)现在将发出 DeprecationWarning - 应该改用.__getitem__(slice(start, end))

使用...(省略号)索引 MaskedArrays/Constants 现在返回 MaskedArray

此行为与 np.ndarray 的行为类似,并且考虑了对象 dtype 的 MaskedArrays 中的嵌套数组以及与其他索引形式组合的省略号。

C API 更改

对空数组和 NpyIter 轴的 GUfuncs 的处理

现在允许从 NpyIter 中删除零大小的轴。这意味着从 NpyIter 中删除轴的代码在访问稍后被删除的维度时必须添加额外的检查。

最大的后续更改是,现在允许 gufuncs 具有零大小的内部维度。这意味着 gufunc 现在必须预期一个空的内部维度,而以前是不可能的,并且会引发错误。

对于大多数 gufuncs,不需要进行任何更改。然而,现在对于具有(..., N, M) -> (..., M)这样的签名的 gufuncs,如果N=0,则可以返回有效结果,而无需进一步的包装代码。

添加了PyArray_MapIterArrayCopyIfOverlap到 NumPy C-API

PyArray_MapIterArray类似,但具有附加的copy_if_overlap参数。如果copy_if_overlap != 0,则检查输入是否与任何其他数组重叠,并根据需要进行复制,以避免在迭代期间修改输入时出现问题。有关更完整的文档,请参阅文档。

对空数组和 NpyIter 轴的 GUfuncs 的处理

现在允许从 NpyIter 中删除零大小的轴。这意味着从 NpyIter 中删除轴的代码在访问稍后被删除的维度时必须添加额外的检查。

最大的后续更改是,现在允许 gufuncs 具有零大小的内部维度。这意味着 gufunc 现在必须预期一个空的内部维度,而以前是不可能的,并且会引发错误。

对于大多数 gufuncs,不需要进行任何更改。然而,现在对于具有(..., N, M) -> (..., M)这样的签名的 gufuncs,如果N=0,则可以返回有效结果,而无需进行进一步的包装代码。

添加了PyArray_MapIterArrayCopyIfOverlap到 NumPy C-API

PyArray_MapIterArray类似,但有额外的copy_if_overlap参数。如果copy_if_overlap != 0,则检查输入是否与其他数组重叠,并根据需要进行复制,以避免在迭代过程中修改输入时出现问题。有关更完整的文档,请参阅文档。

新特性

添加了__array_ufunc__

这是重命名和重新设计的__numpy_ufunc__。任何类,无论是否是 ndarray 子类,都可以定义这个方法或将其设置为None,以覆盖 NumPy 的 ufunc 行为。这与 Python 的__mul__和其他二进制操作例程非常相似。有关实现和此新选项行为的更详细描述,请参阅文档。API 是临时的,我们尚未保证向后兼容性,因为可能会根据反馈意见做出修改。有关更多详细信息,请参阅NEP 13文档

新的positive ufunc

这个 ufunc 对应于一元的+运算符,但与 ndarray 上的+不同,如果数组值不支持数值运算,它将引发错误。

新的divmod ufunc

这个 ufunc 对应于 Python 内置的divmod,用于在 numpy 数组上调用divmod时使用。np.divmod(x, y)计算的结果等效于(np.floor_divide(x, y), np.remainder(x, y)),但速度大约是分别调用这些函数的两倍。

np.isnat ufunc 用于测试 NaT 特殊的日期时间和时间差数值

新的 ufuncnp.isnat可以在日期时间和时间差数组中找到特殊 NaT 值的位置。这类似于np.isnan

np.heaviside ufunc 计算 Heaviside 函数

新函数np.heaviside(x, h0)(一个 ufunc)计算 Heaviside 函数:

 { 0   if x < 0,
heaviside(x, h0) = { h0  if x == 0,
                   { 1   if x > 0. 

为创建块数组的np.block函数

添加了一个新的block函数到当前的叠加函数vstackhstackstack中。这允许同时沿多个轴进行连接,具有类似数组创建的语法,不同之处在于元素本身可以是数组。例如:

>>> A = np.eye(2) * 2
>>> B = np.eye(3) * 3
>>> np.block([
...     [A,               np.zeros((2, 3))],
...     [np.ones((3, 2)), B               ]
... ])
array([[ 2.,  0.,  0.,  0.,  0.],
 [ 0.,  2.,  0.,  0.,  0.],
 [ 1.,  1.,  3.,  0.,  0.],
 [ 1.,  1.,  0.,  3.,  0.],
 [ 1.,  1.,  0.,  0.,  3.]]) 

虽然主要用于块矩阵,但对于数组的任意维度也适用。

这类似于 Matlab 用于创建块矩阵的方括号表示法。

isin函数,对in1d进行了改进

新函数isin测试 N 维数组的每个元素是否存在于第二个数组中的任何位置。它是in1d的增强版,保留了第一个数组的形状。

临时省略

在提供backtrace函数的平台上,NumPy 将尝试避免在涉及基本数值类型的表达式中创建临时变量。例如d = a + b + c被转换为d = a + b; d += c,这样可以提高大数组的性能,因为执行操作需要更少的内存带宽。

uniqueaxes参数

在 N 维数组中,用户现在可以选择沿其进行查找重复 N-1 维元素的轴,使用numpy.unique。如果axis=None(默认值),则恢复原始行为。

np.gradient现在支持不均匀间距数据

用户现在可以为数据指定不均匀间距。特别是np.gradient现在可以使用:

  1. 单个标量用于指定所有维度的采样距离。

  2. N 个标量用于指定每个维度的常量采样距离。即dxdydz,…

  3. N 个数组用于指定 F 的每个维度上数值的坐标。数组的长度必须与相应维度的大小相匹配

  4. 任意数量的 N 个标量/数组,表示第 2 和第 3 个含义。

这意味着现在可以做以下操作:

>>> f = np.array([[1, 2, 6], [3, 4, 5]], dtype=np.float_)
>>> dx = 2.
>>> y = [1., 1.5, 3.5]
>>> np.gradient(f, dx, y)
[array([[ 1\. ,  1\. , -0.5], [ 1\. ,  1\. , -0.5]]),
 array([[ 2\. ,  2\. ,  2\. ], [ 2\. ,  1.7,  0.5]])] 

支持在apply_along_axis中返回任意维度的数组

以前,只能通过传递给apply_along_axis的函数返回标量或 1D 数组。现在可以返回任意维度(包括 0D)的数组,并且这个数组的形状将替换正在迭代的数组的轴。

dtype添加了.ndim属性,以补充.shape

为了与ndarraybroadcast保持一致,d.ndimlen(d.shape)的简写。

Python 3.6 中支持 tracemalloc

NumPy 现在支持与 Python 3.6 或更新版本的tracemalloc模块一起进行内存跟踪。NumPy 的内存分配被放置到由numpy.lib.tracemalloc_domain定义的域中。请注意,NumPy 分配将不会在早期 Python 版本的tracemalloc中显示出来。

NumPy 可能使用放松的步幅检查调试构建

当放松步幅检查时,在启用放松步幅检查时,将环境中的 NPY_RELAXED_STRIDES_DEBUG=1 设置为 npy_intp 的最大值,以帮助检测下游项目中步幅的无效使用。启用后,无效使用通常会导致错误被引发,但确切的错误类型取决于代码的细节。在实际应用中观察到了 TypeError 和 OverflowError。

以前的情况是该选项在发布时被禁用,在主分支中启用,并且在两者之间切换需要编辑代码。现在默认情况下被禁用,但可以在测试构建中启用。

添加了__array_ufunc__

这是重命名和重新设计的__numpy_ufunc__. 任何类,无论是否是 ndarray 子类,都可以定义这个方法或将其设置为None,以覆盖 NumPy 的 ufunc 的行为。 这与 Python 的__mul__和其他二元操作例程相似。 有关此新选项的实现和行为的更详细描述,请参阅文档。 API 是临时的,我们尚未保证向后兼容性,因为可能会根据反馈做出修改。 有关更多详细信息,请参阅NEP 13文档

新的positive ufunc

这个 ufunc 对应于一元+,但与 ndarray 上的+不同,如果数组值不支持数值操作,它将引发错误。

新的divmod ufunc

这个 ufunc 对应于 Python 内置的divmod,用于在 numpy 数组上调用divmod时使用。np.divmod(x, y) 计算等同于 (np.floor_divide(x, y), np.remainder(x, y)) 的结果,但是调用这两个函数的速度大约快两倍。

np.isnat ufunc 用于测试 NaT 日期时间和时间差值的特殊值

新的 ufunc np.isnat 在日期时间数组中查找特殊 NaT 值的位置。这类似于np.isnan

np.heaviside ufunc 计算 Heaviside 函数

新的函数np.heaviside(x, h0)(一个 ufunc)计算 Heaviside 函数:

 { 0   if x < 0,
heaviside(x, h0) = { h0  if x == 0,
                   { 1   if x > 0. 

np.block 函数用于创建块数组

添加一个新的block函数到当前的叠加函数vstackhstackstack。这允许同时沿多个轴进行连接,语法类似于数组创建,但元素本身可以是数组。 例如:

>>> A = np.eye(2) * 2
>>> B = np.eye(3) * 3
>>> np.block([
...     [A,               np.zeros((2, 3))],
...     [np.ones((3, 2)), B               ]
... ])
array([[ 2.,  0.,  0.,  0.,  0.],
 [ 0.,  2.,  0.,  0.,  0.],
 [ 1.,  1.,  3.,  0.,  0.],
 [ 1.,  1.,  0.,  3.,  0.],
 [ 1.,  1.,  0.,  0.,  3.]]) 

虽然主要用于块矩阵,但它适用于数组的任意维度。

这类似于 Matlab 用于创建块矩阵的方括号符号表示法。

isin 函数,对in1d进行了改进

新的函数isin 用于测试 N 维数组中每个元素是否出现在第二个数组中的任何位置。这是对in1d的增强,它保留了第一个数组的形状。

临时省略

在提供backtrace函数的平台上,NumPy 将尽量避免在涉及基本数值类型的表达式中创建临时变量。例如 d = a + b + c 被转换为 d = a + b; d += c,这样可以提高大数组的性能,因为执行操作所需的内存带宽更少。

uniqueaxes 参数

在一个 N 维数组中,用户现在可以选择沿着哪个轴查找重复的 N-1 维元素,使用numpy.unique。如果axis=None(默认值),将恢复原始行为。

np.gradient 现在支持不均匀间隔的数据

用户现在可以指定非常量间距的数据。特别是,np.gradient现在可以接受:

  1. 一个单一的标量用于指定所有维度的样本距离。

  2. N 个标量用于指定每个维度的常量样本距离。例如 dxdydz 等。

  3. N 个数组用于指定 F 沿每个维度的值的坐标。数组的长度必须与相应维度的大小相匹配

  4. 具有 2.和 3.含义的 N 个标量/数组的任意组合。

这意味着,例如,现在可以执行以下操作:

>>> f = np.array([[1, 2, 6], [3, 4, 5]], dtype=np.float_)
>>> dx = 2.
>>> y = [1., 1.5, 3.5]
>>> np.gradient(f, dx, y)
[array([[ 1\. ,  1\. , -0.5], [ 1\. ,  1\. , -0.5]]),
 array([[ 2\. ,  2\. ,  2\. ], [ 2\. ,  1.7,  0.5]])] 

支持在 apply_along_axis 中返回任意维度的数组

之前,apply_along_axis中传递给函数的函数只能返回标量或一维数组。现在,它可以返回任意维度的数组(包括 0 维),并且此数组的形状取代了正在迭代的数组的轴。

.ndim 属性被添加到 dtype 中以补充.shape

为了与 ndarraybroadcast 保持一致,d.ndimlen(d.shape) 的简写。

Python 3.6 支持 tracemalloc

NumPy 现在支持使用 Python 3.6 或更新版本的 tracemalloc 模块进行内存跟踪。来自 NumPy 的内存分配被放入了由 numpy.lib.tracemalloc_domain 定义的领域中。注意,NumPy 分配不会显示在早期 Python 版本的 tracemalloc 中。

NumPy 可能编译时启用松弛步幅检查调试

在启用松弛步幅检查时,在环境中设置 NPY_RELAXED_STRIDES_DEBUG=1 会导致 NumPy 被编译时受影响的步幅设置为 npy_intp 的最大值,以帮助检测下游项目中步幅的无效使用。启用时,无效使用通常会导致错误被引发,但确切的错误类型取决于代码的细节。观察到过 TypeError 和 OverflowError。

之前这个选项默认情况是在发布版中禁用的,并在主代码中启用,转变两者之间需要编辑代码。现在默认情况下禁用,但可以在测试构建中启用。

改进

重叠输入的 ufunc 行为

在先前的 NumPy 版本中,ufunc 输入和输出操作数有内存重叠会产生未定义结果,这是由于数据依赖性问题。在 NumPy 1.13.0 中,从这些操作中产生的结果现在被定义为与不存在内存重叠的等效操作相同。

受影响的操作现在会产生临时副本,以消除数据依赖性所需的副本。由于检测这些情况在计算上是昂贵的,因此使用了一种启发式方法,可能在极少数情况下导致不必要的临时副本。对于启发式算法能够分析数据依赖性足够简单的操作,即使数组重叠,也不会产生临时副本,如果可以推断不需要副本的话。例如,np.add(a, b, out=a) 不会涉及副本。

为了说明一个以前未定义的操作:

>>> x = np.arange(16).astype(float)
>>> np.add(x[1:], x[:-1], out=x[1:]) 

在 NumPy 1.13.0 中,最后一行保证等同于:

>>> np.add(x[1:].copy(), x[:-1].copy(), out=x[1:]) 

与简单的非有问题的数据依赖关系进行类似的操作是:

>>> x = np.arange(16).astype(float)
>>> np.add(x[1:], x[:-1], out=x[:-1]) 

它将继续产生与以前的 NumPy 版本相同的结果,并且不会涉及不必要的临时副本。

这个变化也适用于就地二进制操作,例如:

>>> x = np.random.rand(500, 500)
>>> x += x.T 

现在,这个语句保证等同于x[...] = x + x.T,而在之前的 NumPy 版本中,结果是未定义的。

对于 MinGW 的 64 位 f2py 扩展的部分支持

现在可以使用自由的MinGW工具集来构建包含 Fortran 库的扩展,也可以在 Python 3.5 下使用。这对于仅进行计算并且适度使用运行时(例如读写文件)的扩展非常有效。请注意,这不会消除 Mingwpy 的需求;如果你大量使用运行时,你很可能会遇到问题。相反,它应该被视为一种临时措施,直到 Mingwpy 完全可用。

扩展还可以使用 MinGW 工具集和(movable) WinPython 3.4 发行版的运行库进行编译,这对具有 PySide1/Qt4 前端的程序非常有用。

packbitsunpackbits的性能改进

numpy.packbits函数对布尔输入和numpy.unpackbits进行了优化,使其在连续数据上显著更快。

修复了 PPC 长双精度浮点信息

在之前的 NumPy 版本中,finfo函数返回了有关 Power PC(PPC)上longdouble浮点类型的双倍浮点数格式的无效信息。无效值是由于 NumPy 算法未能处理PPC 长双精度中变化位数的尾数所导致的。此版本通过启发式方法检测 PPC 双重浮点格式来绕过失败的算法。使用这些启发式方法的副作用是,finfo函数比以前的版本快。

ndarray子类的更好默认 repr

没有repr特殊化的 ndarray 子类现在正确缩进其数据和类型行。

更可靠的掩码数组比较

掩码数组的比较对于掩码标量存在错误,并且对于维数大于 1 的结构化数组存在失败。这两个问题现在都已解决。在此过程中,确保在获取结构化数组的结果时,正确忽略掩码字段,即,如果两者中所有非掩码字段相等,则结果相等,使行为等同于比较一个非结构化掩码数组然后在某个轴上执行.all()的行为。

np.matrix 现在可以使用布尔元素的字符串语法创建

每当尝试使用布尔值时,np.matrix都会失败,例如np.matrix('True')。现在,这将按预期运行。

现在更多的linalg操作接受空向量和矩阵

当最后两个维度中有 0 时,np.linalg中的所有以下函数现在在给定输入数组时都会有作用:detslogdetpinveigvalseigvalsheigeigh

LAPACK 的捆绑版本现在是 3.2.2

NumPy 随附了最小的 lapack 实现,适用于未安装 lapack 库的系统,名为lapack_lite。这已经从 LAPACK 3.0.0(1999 年 6 月 30 日)升级到 LAPACK 3.2.2(2010 年 6 月 30 日)。详情请参阅LAPACK 更改日志

虽然没有通过numpy暴露新功能,但这解决了有关“工作空间”大小的一些错误,并且在某些情况下可能使用更快的算法。

np.hypot.reducenp.logical_xorreduce在更多情况下被允许

现在可以在空数组上运行,并返回 0,并且可以在多个轴上进行缩减。在这些情况下以前会抛出ValueError

优化对象数组的repr

不再出现包含自身的对象数组导致递归错误的情况。

包含list对象的对象数组现在以一种清晰地区分二维对象数组和包含列表的一维对象数组的方式打印出来。

重叠输入的 ufunc 行为

在以前的 NumPy 版本中,ufunc 输入和输出操作数存在内存重叠时,由于数据依赖性问题,此类操作产生未定义的结果。在 NumPy 1.13.0 中,这类操作的结果现在被定义为与不存在内存重叠的操作的等效操作的结果相同。

受影响的操作现在将作临时复制,以消除数据依赖关系。由于检测这些情况在计算上是昂贵的,因此使用了一种启发式方法,这可能在极少数情况下导致不必要的临时复制。对于启发式分析能够分析的数据依赖性较简单的操作,即使数组重叠,也将不进行复制,如果能推断出不需要复制。例如,np.add(a, b, out=a)将不涉及复制。

举例说明先前未定义的操作:

>>> x = np.arange(16).astype(float)
>>> np.add(x[1:], x[:-1], out=x[1:]) 

在 NumPy 1.13.0 中,最后一行现在保证等同于:

>>> np.add(x[1:].copy(), x[:-1].copy(), out=x[1:]) 

具有简单且无问题的数据依赖关系的类似操作是:

>>> x = np.arange(16).astype(float)
>>> np.add(x[1:], x[:-1], out=x[:-1]) 

它将继续产生与之前 NumPy 版本相同的结果,并且不会涉及不必要的临时复制。

该变化也适用于原地二进制操作,例如:

>>> x = np.random.rand(500, 500)
>>> x += x.T 

现在该语句保证等同于x[...] = x + x.T,而在以前的 NumPy 版本中,结果是未定义的。

针对 MinGW 的 64 位 f2py 扩展的部分支持

通过免费的MinGW工具集,现在可以构建包含 Fortran 库的扩展,也支持 Python 3.5。这对于只进行计算并且适度使用运行时(例如读写文件)的扩展效果最佳。需要注意这并不意味着不再需要 Mingwpy;如果你大量使用运行时,很可能会遇到问题。相反,它应该被看作是一种临时措施,直到 Mingwpy 完全可用为止。

使用(可移动的)WinPython 3.4 发行版的运行时库,也可以使用 MinGW 工具集编译扩展,这对于具有 PySide1/Qt4 前端的程序非常有用。

packbitsunpackbits的性能改进

numpy.packbitsnumpy.unpackbits函数已经优化,对于连续数据,性能显著提升。

修复了 PPC 长双浮点信息的问题

在之前的 NumPy 版本中,finfo函数返回了关于 Power PC(PPC)上的longdouble浮点类型的double double格式的无效信息。无效值是由于 NumPy 算法未能处理PPC 长双浮点数中变化的小数位数所导致的。此版本通过启发式算法来避开失败的算法,以侦测 PPC double double 格式。使用这些启发算法的副作用是,finfo函数比之前的版本更快。

ndarray子类的更好默认 repr

没有repr特殊化的 ndarray 子类现在可以正确缩进它们的数据和类型行。

掩码数组的比较更可靠了

掩码数组的比较对于掩码标量存在错误,并且对于维度大于 1 的结构化数组存在失败。这两个问题现在都已解决。在这个过程中,确保在获得结构化数组的结果时,忽略掩码字段,即,如果两者中所有非掩码字段相等,则结果相等,使行为与比较无结构掩码数组后在某些轴上进行.all()相同。

现在可以使用字符串语法创建包含布尔元素的np.matrix

以前,每当尝试将np.matrix与布尔值一起使用时,例如,np.matrix('True'),都会失败。现在,这可以按预期工作。

现在,更多linalg操作可以接受空向量和矩阵

所有np.linalg中的以下函数,现在在最后两个维度中有 0 的输入数组时都可以工作:detslogdetpinveigvalseigvalsheigeigh

绑定的 LAPACK 版本现在是 3.2.2

NumPy 内置了一个最小实现的 lapack,用于在没有安装 lapack 库的系统中使用,名为lapack_lite。它已从 LAPACK 3.0.0(1999 年 6 月 30 日)升级到 LAPACK 3.2.2(2010 年 6 月 30 日)。有关这意味着的所有更改的详细信息,请参见LAPACK 更改日志

虽然numpy没有暴露任何新功能,但它修复了一些关于“工作空间”大小的错误,并且在某些地方可能使用更快的算法。

np.hypot.reducenp.logical_xorreduce在更多情况下允许

这现在可以在空数组上进行,返回 0,并且可以减少多个轴上。以前,在这些情况下会引发ValueError

对象数组的更好的repr

不再导致递归错误包含自己的对象数组。

包含list对象的对象数组现在以一种清晰地区分二维对象数组和包含列表的一维对象数组的方式打印。

变更

屏蔽数组上的argsort采用相同的默认参数作为sort

默认情况下,argsort现在将屏蔽值放在排序后的数组末尾,就像sort已经做的那样。此外,为了与sort保持一致,还添加了end_with参数到argsort。请注意,这个参数不是添加到末尾的,因此会破坏将fill_value作为位置参数传递的任何代码。

average现在保留子类

对于 ndarray 子类,numpy.average现在将返回一个子类的实例,与大多数其他 NumPy 函数(如mean)的行为相匹配。因此,现在可能返回一个子类数组标量的调用也可能返回标量。

array == Nonearray != None进行逐元素比较

以前,这些操作分别返回标量FalseTrue

对象数组的np.equal,np.not_equal忽略对象标识

以前,这些函数总是将相同的对象视为相等。这会导致覆盖比较失败、比较不返回布尔值的对象(如 np.arrays),以及比较结果不同于对象标识的对象,如 NaNs。

布尔索引变更

  • 布尔数组(如 python 布尔值列表)始终被视为布尔索引。

  • 布尔标量(包括 python True)是合法的布尔索引,永远不会被视为整数。

  • 布尔索引必须匹配它们索引的轴的维度。

  • 赋值的左手边使用的布尔索引必须匹配右手边的维度。

  • 对标量数组进行布尔索引会返回一个新的一维数组。这意味着array(1)[array(True)]会返回array([1])而不是原始数组。

使用坏协方差矩阵时,np.random.multivariate_normal的行为

现在可以通过使用两个新的关键字参数来调整处理协方差矩阵时的函数行为:

  • 可以使用tol来指定在检查协方差矩阵是否为正定时要使用的容差。

  • check_valid可用于配置在存在非正定矩阵时函数将执行的操作。有效选项为ignorewarnraise。默认值warn保持了上一个版本中使用的行为。

assert_array_less现在比较np.inf-np.inf

以前,np.testing.assert_array_less忽略了所有无限值。这不符合文档和直觉上的预期行为。现在,-inf < x < inf 对于任何实数 x 都被认为是True,其他情况都失败。

assert_array_和屏蔽数组assert_equal现在隐藏较少的警告

之前被assert_array_函数隐藏的一些警告现在不再隐藏。在大多数情况下,这些警告应该是正确的,如果出现,将需要更改使用这些函数的测试。对于屏蔽数组assert_equal版本,当比较 NaT 时可能会出现警告。该函数目前不明确处理 NaT 或 NaN,如果由于此更改而出现警告,则最好在此时避免使用它。

memmap对象中的offset属性值

memmap对象中的offset属性现在设置为文件偏移量。这对于大于mmap.ALLOCATIONGRANULARITY的偏移量只是行为上的更改。

对于标量输入,np.realnp.imag返回标量

以前,当提供标量输入时,np.realnp.imag以前返回数组对象,这与其他函数如np.anglenp.conj不一致。

多项式方便类不能传递给 ufuncs

ABCPolyBase 类,方便类派生自该类,设置了__array_ufun__ = None,以便退出 ufuncs。如果将多项式方便类实例作为 ufunc 的参数传递,现在将会引发TypeError

Ufunc 的输出参数也可以是元组

对于 ufunc 的调用,已经可以使用一个具有多个输出的元组作为out参数,这现在已扩展到reduceaccumulatereduceat方法的输出参数。这主要是为了与__array_ufunc兼容;目前还没有一个 ufunc 具有多个输出。

屏蔽数组上的argsort采用与sort相同的默认参数

默认情况下,argsort现在将屏蔽值放在已排序数组的末尾,与sort的行为一致。另外,为了与sort保持一致,argsort添加了end_with参数。请注意,此参数不在最后添加,因此会破坏任何将fill_value作为位置参数传递的代码。

average现在保留子类

对于 ndarray 子类,numpy.average 现在会返回子类的实例,与大多数其他 NumPy 函数的行为相匹配,比如 mean。 因此,也可能出现调用返回子类数组标量的情况。

array == Nonearray != None 进行逐元素比较

以前,这些操作分别返回标量值 FalseTrue

对于对象数组,np.equal, np.not_equal 忽略了对象标识

以前,这些函数总是将相同的对象视为相等。 这会覆盖比较失败、不返回布尔值的对象的比较(如 np.arrays)以及结果与对象标识不同的对象的比较(如 NaNs)。

布尔索引的更改

  • 类似布尔数组(例如 python 布尔列表)始终被视为布尔索引。

  • 布尔标量(包括 python True)是合法的布尔索引,并且永远不被视为整数。

  • 布尔索引必须与它们索引的轴的维度匹配。

  • 在赋值的左手边使用的布尔索引必须与右手边的维度匹配。

  • 将标量数组进行布尔索引将返回一个新的一维数组。 这意味着 array(1)[array(True)] 会得到 array([1]) 而不是原始数组。

使用错误协方差矩阵时,np.random.multivariate_normal 的行为

现在可以通过两个新的关键参数来调整处理协方差矩阵时函数的行为:

  • tol 可用于指定在检查协方差矩阵是否为正定时使用的容差。

  • check_valid 可用于配置在存在非正定矩阵时函数将执行什么操作。 有效选项包括 ignorewarnraise。 默认值 warn 保持了之前版本的行为。

assert_array_less 现在比较 np.inf-np.inf

以前,np.testing.assert_array_less 忽略所有无限值。 这不符合文件和直觉中的预期行为。 现在,-inf < x < inf 被认为对于任何实数 x 都为 True,其他情况都失败。

assert_array_ 和掩码数组 assert_equal 抑制了更少的警告

一些以前被 assert_array_ 函数隐藏的警告现在不再隐藏。 在大多数情况下,这些警告应该是正确的,如果出现这些警告,则需要更改使用这些函数的测试。 对于掩码数组 assert_equal 版本,在比较 NaT 时可能会产生警告。 目前该函数不特别处理 NaT 或 NaN,如果由于此更改而出现警告,最好在此时避免使用它。

memmap 对象中的 offset 属性值

memmap 对象中的 offset 属性现在设置为文件的偏移量。 这只是对大于 mmap.ALLOCATIONGRANULARITY 的偏移量进行的行为更改。

np.realnp.imag 对于标量输入返回标量值

以前,np.realnp.imag在提供标量输入时会返回数组对象,这与np.anglenp.conj等其他函数不一致。

无法将多项式便利类传递给 ufuncs

从 ABCBase 类中派生的便利类设置__array_ufunc__ = None以退出 ufuncs。如果将多项式便利类实例作为参数传递给 ufunc,现在会引发TypeError

对于 ufunc 方法,输出参数也可以是元组

对于对 ufuncs 的调用,已经可以使用带有元组的out参数来处理具有多个输出的 ufuncs,这已经扩展到了reduceaccumulatereduceat方法的输出参数。这主要是为了与__array_ufunc__兼容;目前还没有超过一个输出的 ufuncs。

NumPy 1.12.1 发布说明

原文:numpy.org/doc/1.26/release/1.12.1-notes.html

NumPy 1.12.1 支持 Python 2.7 和 3.4-3.6,并修复了 NumPy 1.12.0 中发现的错误和回归。特别是,f2py 常量解析中的回归已经修复。可以在 PyPI 上找到 Linux、Windows 和 OSX 版本的安装包。

修复的错误

  • BUG: 修复错误的未来 nat 警告和等效类型逻辑错误…

  • BUG: 修复了一些特殊情况下错误的屏蔽中位数

  • DOC: 将 np.average 放入内联代码中

  • TST: 解决 i386 上 isfinite 的不一致性

  • BUG: 防止在 f2py 中替换没有'_'规范的常量。

  • BUG: 修复 float 16 非数组输入的均值为 1.12

  • BUG: 修复调用 python api 时设置错误和轻微泄漏…

  • BUG: 使 iscomplexobj 再次与自定义 dtype 兼容

  • BUG: 修复由坏 array_wrap 引起的未定义行为

  • BUG: 修复 MaskedArray.setitem

  • BUG: PPC64el 机器在 f2py 中是 FORTRAN 的 POWER

  • BUG: 在_frommethod中查找 MaskedArray 的方法

  • BUG: 在 binary_repr 的限制处删除额外的数字

  • BUG: 修复空数组的深度复制回归。

  • BUG: 修复空的 ndarrays 的 ma.median

修复的错误

  • BUG: 修复错误的未来 nat 警告和等效类型逻辑错误…

  • BUG: 修复了一些特殊情况下错误的屏蔽中位数

  • DOC: 将 np.average 放入内联代码中

  • TST: 解决 i386 上 isfinite 的不一致性

  • BUG: 防止在 f2py 中替换没有'_'规范的常量。

  • BUG: 修复 float 16 非数组输入的均值为 1.12

  • BUG: 修复调用 python api 时设置错误和轻微泄漏…

  • BUG: 使 iscomplexobj 再次与自定义 dtype 兼容

  • BUG: 修复由坏 array_wrap 引起的未定义行为

  • BUG: 修复 MaskedArray.setitem

  • BUG: PPC64el 机器在 f2py 中是 FORTRAN 的 POWER

  • BUG: 在_frommethod中查找 MaskedArray 的方法

  • BUG: 在 binary_repr 的限制处删除额外的数字

  • BUG: 修复空数组的深度复制回归。

  • BUG: 修复空的 ndarrays 的 ma.median

NumPy 1.12.0 版本发布说明

原文:numpy.org/doc/1.26/release/1.12.0-notes.html

此版本支持 Python 2.7 和 3.4-3.6。

亮点

NumPy 1.12.0 版本包含大量修复和改进,但没有一个在所有其他方面都突出。这使得选择亮点有点随意,但以下内容可能特别感兴趣,或者指示可能会产生未来后果的领域。

  • np.einsum中的操作顺序现在可以优化,以获得大幅度的速度提升。

  • np.vectorize的新signature参数,用于向量化核心维度。

  • 向许多函数添加了keepdims参数。

  • 用于测试警告的新上下文管理器

  • 用于 numpy.distutils 的 BLIS 支持

  • 对 PyPy 的支持大大改善(尚未完成)

不再支持

  • 支持 Python 2.6、3.2 和 3.3 已被停止。

增加的支持

  • 添加了对 PyPy 2.7 v5.6.0 的支持。尽管尚不完整(nditer updateifcopy尚不支持),这是 PyPy 的 C-API 兼容层的一个里程碑。

构建系统更改

  • 库顺序被保留,而不是被重新排序以匹配目录的顺序。

弃用

ndarray 对象的data属性赋值

如 gh-7083 中指出的,赋值‘data’属性是一种固有的不安全操作。这种能力将来会被移除。

linspace中对 num 属性的不安全强制转换

当 num 不能安全地解释为整数时,np.linspace现在会引发 DeprecationWarning。

binary_repr的位宽参数不足

如果将“width”参数传递到binary_repr中,这是不足以表示数字的二进制(正)或 2 的补码(负)形式,函数将令人安静地忽略这个参数,返回使用所需形式的最小位数的表示。这种行为现在被认为从用户的角度来看是不安全的,并在将来会引发错误。

未来变化

  • 在 1.13 版本中,NAT 除了NAT != NAT之外都将始终比较为 False,这将是 True。简而言之,NAT 的行为将类似于 NaN。

  • 在 1.13 版本中,np.average将保留子类,以匹配大多数其他 numpy 函数(如 np.mean)的行为。特别是,意味着返回标量的调用可能返回一个 0-d 子类对象。

结构化数组的多字段操作

在 1.13 版本中,涉及多个字段的结构化数组的行为将以两种方式发生变化:

首先,在 1.13 版本中,使用多个字段索引结构化数组(例如,arr[['f1', 'f3']])将返回原始数组的视图,而不是副本。请注意,返回的视图将具有与原始数组中的中间字段对应的额外填充字节,与 1.12 中的副本不同,这将影响arr[['f1', 'f3']].view(newdtype)等代码。

第二,对于 numpy 版本 1.6 到 1.12,结构化数组之间的赋值发生“按字段名称”:目标数组中的字段设置为源数组中相同命名字段,或者如果源数组没有该字段,则设置为 0:

>>> a = np.array([(1,2),(3,4)], dtype=[('x', 'i4'), ('y', 'i4')])
>>> b = np.ones(2, dtype=[('z', 'i4'), ('y', 'i4'), ('x', 'i4')])
>>> b[:] = a
>>> b
array([(0, 2, 1), (0, 4, 3)],
 dtype=[('z', '<i4'), ('y', '<i4'), ('x', '<i4')]) 

在 1.13 中,赋值将改为“按位置”进行:目标的第 N 个字段将被设置为源的第 N 个字段,而不考虑字段名称。可以通过使用索引重新排序字段来获取旧的行为,例如,b[['x', 'y']] = a[['y', 'x']]

兼容性注意事项

DeprecationWarning 变为错误

  • 用浮点数进行索引引发IndexError,例如a[0, 0.0]

  • 用非整数 array_like 进行索引引发IndexError,例如a['1', '2']

  • 使用多个省略号进行索引会引发IndexError,例如a[..., ...]

  • 非整数用作索引值会引发TypeError,例如在reshapetake和指定 reduce axis 中。

FutureWarning 变为更改的行为

  • 如果没有指定 dtype,则np.full现在将返回填充值的 dtype 数组,而不是默认为浮点数。

  • 如果np.average的参数是 ndarray 的子类,将发出警告,因为子类将从 1.13 开始被保留。(请参阅未来更改)

power**对负整数幂的整数引发错误

先前的行为取决于涉及 numpy 标量整数还是 numpy 整数数组。

对于数组

  • 零到负整数次幂返回最小的整数值。

  • 1、-1 都对负整数次幂返回正确的值。

  • 剩余的整数在提升为负整数幂时返回零。

对于标量

  • 零到负整数次幂返回最小的整数值。

  • 1、-1 都对负整数次幂返回正确的值。

  • 剩余的整数有时返回零,有时返回正确的浮点数,这取决于整数类型组合。

所有这些情况现在都会引发ValueError,除了那些公共类型为浮点数的整数组合,例如 uint64 和 int8。人们认为,制定一个简单的规则是最好的选择,而不是为整数单元准备特殊的异常。如果你需要负指数,使用不精确的类型。

放宽的步幅检查是默认情况

这将对假定F_CONTIGUOUSC_CONTIGUOUS互斥并且可以设置以确定现在都具有的数组的默认顺序的代码产生一些影响。

np.percentile ‘midpoint’ 插值方法对于精确索引已经修复

当两者重合时,‘midpoint’插值器现在会给出与‘lower’和‘higher’相同的结果。修复了‘lower’ + 0.5 的以前行为。

keepdims kwarg 传递给用户类方法

现在使用keepdims kwarg 的 numpy 函数会将该值传递给 ndarray 子类的相应方法。以前,keepdims关键字会被悄悄丢弃。这些函数现在具有以下行为:

  1. 如果用户没有提供keepdims,则不会传递关键字给底层方法。

  2. 任何用户提供的 keepdims 值都作为关键字参数传递给方法。

当方法不支持 keepdims 关键字参数并且用户明确传递 keepdims 时,这将引发异常。

修改了以下函数:sumproductsometruealltrueanyallamaxaminprodmeanstdvarnanminnanmaxnansumnanprodnanmeannanmediannanvarnanstd

bitwise_and 标识已更改

先前的标识是 1,现在是 -1。更多解释请参见改进条目。

当遇到未屏蔽的无效值时,ma.median 发出警告并返回 nan

与未屏蔽中位数类似,现在 ma.median 会在存在未屏蔽的 NaN 的切片中发出运行时警告,并返回 NaN

assert_almost_equal 中更一致

标量的精度检查已更改以匹配数组的精度检查。现在是:

abs(actual - desired) < 1.5 * 10**(-decimal) 

请注意,这比以前文档中记录的要宽松,但与以前在 assert_array_almost_equal 中使用的实现一致。由于实现的更改,一些非常微妙的测试可能会失败,而以前没有失败。

NoseTester 在测试期间的警告行为

给定 raise_warnings="develop",现在所有未捕获的警告都将被视为测试失败。先前只有选择的警告被引发。未捕获或引发的警告(主要是在发布模式下时)将在测试周期中显示一次,类似于默认的 Python 设置。

assert_warnsdeprecated 装饰器更具体

assert_warns 函数和上下文管理器现在更具体于给定的警告类别。这种增加的特异性导致它们被根据外部警告设置处理。这意味着在给定和在上下文之外被忽略的错误类别警告产生时不会引发任何警告。另外,增加的特异性可能意味着不再会显示或引发错误地被忽略的警告。也请参阅新的 suppress_warnings 上下文管理器。deprecated 装饰器也是如此。

C API

无改动。

新功能

as_stridedwriteable 关键字参数

np.lib.stride_tricks.as_strided 现在有一个 writeable 关键字参数。当预期不进行返回数组的写操作时,可以将其设置为 False,以避免意外的无法预测的写入。

rot90axes 关键字参数

rot90 中的 axes 关键字参数确定数组旋转的平面。默认为 axes=(0,1),与原始函数相同。

通用的 flip

flipudfliplr 分别沿 axis=0 和 axis=1 反转数组的元素。新添加的 flip 函数沿给定轴反转数组的元素。

  • np.count_nonzero 现在有一个 axis 参数,允许在不仅仅是扁平数组对象上生成非零计数。

numpy.distutils 中的 BLIS 支持

现在支持使用由 BLIS 库提供的 BLAS 实现进行构建。请参见 numpy 存储库或源分发包根目录中的 site.cfg.example(在 [blis] 部分)。

numpy/__init__.py 中连接到运行特定分发检查的钩子

numpy 的二进制分发可能需要在 numpy 初始化期间运行特定硬件检查或加载特定库。例如,如果我们将 numpy 与需要 SSE2 指令的 BLAS 库一起分发,我们希望检查运行 numpy 的计算机是否具有 SSE2 以提供有关错误的信息。

numpy/__init__.py 中添加了连接到导入 numpy/_distributor_init.py 文件的钩子,该文件将保留为空(除了文档字符串)在标准 numpy 源中,但可以被制作 numpy 二进制分发的人覆盖。

添加了新的 nan 函数 nancumsumnancumprod

nancumsumnancumprod 函数已添加,可以忽略 NaN 值计算 cumsumcumprod

np.interp 现在可以插值复数值

np.lib.interp(x, xp, fp) 现在允许插值数组 fp 是复数,并将以 complex128 精度进行插值。

添加了新的多项式评估函数 polyvalfromroots

新函数 polyvalfromroots 在多项式的根给定点求值。这对于高阶多项式很有用,在机器精度下将多项式展开成系数是不准确的。

新的数组创建函数 geomspace 已添加

新函数 geomspace 生成几何序列。它类似于 logspace,但直接指定了起始和停止值:geomspace(start, stop)logspace(log10(start), log10(stop)) 作用相同。

用于测试警告的新上下文管理器

新的上下文管理器 suppress_warnings 已添加到测试工具中。该上下文管理器旨在帮助可靠地测试警告,特别是可靠地过滤/忽略警告。在 Python 3.4.x 之前的版本中使用“ignore”过滤器快速导致这些(或类似的)警告无法可靠地进行测试。

该上下文管理器允许过滤(以及记录)类似于 catch_warnings 上下文的警告,但更容易具体化。此外,打印未被过滤或嵌套上下文管理器的警告将如预期般工作。此外,当多个测试需要隐藏相同的警告时,将上下文管理器用作装饰器将非常有用。

新的掩码数组函数 ma.convolvema.correlate 已添加

这些函数包装了非掩码版本,但会传播掩码值。有两种不同的传播模式。默认情况下,掩码值会使结果受到掩码的影响,但另一种模式只有在没有替代值时才输出掩码。

新的 float_power ufunc

新的float_power ufunc 类似于power函数,但所有计算都使用至少 float64 的最低精度进行。关于如何处理整数的负整数幂进行了长时间的讨论,一个受欢迎的提议是__pow__操作符应始终返回至少 float64 精度的结果。float_power函数实现了该选项。请注意,它不支持对象数组。

np.loadtxt现在支持一个整数作为usecol参数。

现在允许不使用usecol=(n,)来读取文件的第 n 列,而是允许使用usecol=n。当作为列索引传递非整数时,错误消息更加友好。

histogram改进了自动 bin 估计器

通过bins参数,为histogram添加了‘doane’和‘sqrt’估计器。增加了对自动 bin 估计的范围限制直方图的支持。

np.roll现在可以同时滚动多个轴

rollshiftaxis参数现在相互广播,并相应地移位每个指定的轴。

方法__complex__已经为 ndarrays 实现。

调用complex()时,大小为 1 的数组现在将转换为 Python 复数。

现在支持pathlib.Path对象

标准的np.loadnp.savenp.loadtxtnp.savez等函数现在可以接受pathlib.Path对象作为参数,而不是文件名或打开的文件对象。

np.finfo的新bits属性

这使np.finfo与已经具有该属性的np.iinfo一致。

np.vectorize的新signature参数

该参数允许使用类似于 NumPy generalized universal functions 的核心维度将用户定义的函数向量化。这允许向量化更广泛类别的函数。例如,将两个向量组合成一个标量的任意距离度量可以通过signature='(n),(n)->()'来向量化。详细信息请参阅np.vectorize

发出对整数数组的 py3k 警告

为帮助人们将他们的代码从 Python 2 迁移到 Python 3,python 解释器有一个方便的选项-3,可以在运行时发出警告。其中一个警告是关于整数除法:

$ python -3 -c "2/3"

-c:1: DeprecationWarning: classic int division 

在 Python 3 中,新的整数除法语义也适用于 numpy 数组。通过这个版本,numpy 会发出类似的警告:

$ python -3 -c "import numpy as np; np.array(2)/np.array(3)"

-c:1: DeprecationWarning: numpy: classic int division 

numpy.sctypes 现在也在 Python3 上包括 bytes

之前,在 Python2 上包括 str(bytes)和 unicode,在 Python3 上只有 str(unicode)。

改进

bitwise_and标识已更改

以前的标识是 1,导致在使用 reduce 方法时除最低有效位外所有位都被屏蔽。新的标识是-1,在补码机器上应该能够正确工作,因为所有位将被设置为 1。

广义 ufunc 现在将解锁 GIL

广义 ufunc,包括大部分 linalg 模块,现在将解锁 Python 全局解释器锁。

np.fft中的缓存现在在总大小和项目计数上受到限制

np.fft中的缓存,加速了相同长度的连续 FFT,现在不能无限增长。它们被 LRU(最近最少使用)缓存所取代,如果达到内存大小或项目计数限制,它们将自动清除不再需要的项目。

改进了对零宽字符串/Unicode 数据类型的处理

修复了明确禁止具有零宽字符串数据类型的数组(即dtype('S0')dtype('U0'))的几个接口,并修复了处理此类数据类型时未正确处理的几个错误。特别是,更改ndarray.__new__,以使其在创建新数组时不会自动将dtype('S0')转换为dtype('S1')(反之亦然),并为 unicode 类型也是如此。

使用 AVX2 矢量化的整数 ufunc

如果 CPU 在运行时支持它,则基本整数 ufunc 现在使用 AVX2 指令。目前,只有在使用 GCC 编译时才能使用此功能。

np.einsum 中的操作顺序进行了优化

np.einsum 现在支持optimize参数,可以优化收缩的顺序。例如,np.einsum将在单次传递中完成链点示例np.einsum(‘ij,jk,kl->il’, a, b, c),其规模为N⁴;然而,当optimize=True时,np.einsum将创建一个中间数组,将此规模减小到或有效地np.dot(a, b).dot(c)。使用中间张量减少规模已经应用于一般的 einsum 求和符号。有关更多详细信息,请参见np.einsum_path

快速排序已更改为 introsort

np.sort 和 np.argsort 的 quicksort 类型现在是 introsort,这是常规 quicksort,但在进展不足时改变为 heapsort。这保留了 quicksort 的良好性能,同时将最坏情况运行时间从O(N²)更改为O(N*log(N))

ediff1d 提高了性能和子类处理

ediff1d 函数使用数组而不是平坦的迭代器进行减法。当 to_begin 或 to_end 不为 None 时,执行原地减法以消除复制操作。副作用是某些子类的处理更好,即 astropy.Quantity,因为创建了完整的数组,然后包装,然后设置了开始和结束值,而不是使用 concatenate。

改进了 float16 数组的ndarray.mean的精度

现在以 float32 执行 float16 数组的均值计算,以提高精度。这在 Theano 等包中应该很有用,其中 float16 的精度是足够的,而其较小的占用空间是可取的。

变更

所有类似数组的方法现在在 fromnumeric.py 中使用关键字参数调用

在 fromnumeric.py 中,许多类似数组的方法在内部用位置参数而不是关键字参数调用,因为它们的外部签名是这样的。这在下游的‘pandas’库中引起了复杂性,遇到了‘numpy’兼容性的问题。现在,这个模块中的所有类似数组的方法都使用关键字参数调用。

大多数情况下,np.memmap 对象上的操作会返回 numpy 数组

以前对 memmap 对象的操作会误导性地返回一个 memmap 实例,即使结果实际上并非 memmap。例如,arr + 1arr + arr将返回 memmap 实例,尽管输出数组的内存没有被映射。1.12 版本将从这些操作中返回普通的 numpy 数组。

此外,对 memmap 的减少(例如.sum(axis=None)现在返回一个 numpy 标量,而不是 0d 的 memmap。

增加警告的 stacklevel

对于基于 Python 的警告,stacklevel 被增加,以便大多数警告将报告用户代码的有问题行而不是警告本身的行。现在测试传递 stacklevel 以确保新警告将接收stacklevel参数。

这会导致“default”或“module”过滤器的警告在每个有问题的用户代码行或用户模块上都显示一次,而不是只显示一次。在 3.4 版本之前的 Python 版本中,这可能导致以前被错误地忽略的警告出现,这可能会让人感到惊讶,特别是在测试套件中。

亮点

NumPy 1.12.0 版本包含大量修复和改进,但没有几个是特别突出的。这使得挑选亮点有点随意,但以下内容可能特别引起兴趣,或者表明可能会产生未来影响的领域。

  • np.einsum中操作的顺序现在可以针对大的速度改进进行优化。

  • np.vectorize的新的signature参数,以便使用核心维度进行矢量化。

  • 在许多函数中添加了keepdims参数。

  • 用于测试警告的新上下文管理器

  • numpy.distutils 中对 BLIS 的支持

  • 对 PyPy 的支持得到了大大改进(尚未完成)

支持已停止

  • 支持 Python 2.6、3.2 和 3.3 已经取消。

已增加的支持

  • 已添加对 PyPy 2.7 v5.6.0 的支持。尽管尚不完整(nditer updateifcopy尚不支持),但这对于 PyPy 的 C-API 兼容层是一个里程碑。

构建系统的改变

  • 库的顺序被保留,而不是重新排序以匹配目录顺序。

已弃用

ndarray 对象的data属性赋值

赋值‘data’属性是一个本质上不安全的操作,如 gh-7083 中指出的那样。这样的功能将在将来被移除。

linspace中 num 属性的不安全整数转换

当 num 无法安全解释为整数时,np.linspace现在会触发 DeprecationWarning。

binary_repr的位宽参数不足

如果向binary_repr传递一个“宽度”参数,该参数不足以表示基于 2 进制的数字(正数或 2 的补码形式的负数)所需的位数,函数将静默忽略该参数,并返回使用所需形式的最小位数的表示。这样的行为现在从用户角度被认为是不安全的,并将在将来引发错误。

对 ndarray 对象的data属性进行赋值

赋值‘data’属性是一种天生不安全的操作,正如在 gh-7083 中所指出的那样。这样的能力将在将来被移除。

linspace中 num 属性进行不安全的整数类型转换

当 num 无法安全解释为整数时,np.linspace现在会引发 DeprecationWarning。

binary_repr的位数参数不足

如果binary_repr传入一个“宽度”参数,该参数无法表示正数的二进制(或负数的二进制补码)形式所需的位数,函数会静默忽略该参数,并返回一个使用所需形式的最少位数表示的结果。从用户角度来看,这样的行为现在被视为不安全,将来会引发错误。

将来的变化

  • 在 1.13 版中,NAT 将总是比较 False,除了NAT != NAT,它将会返回 True。简而言之,NAT 将表现得像 NaN。

  • 在 1.13 版中,np.average将保留子类,以匹配大多数其他 numpy 函数的行为,如 np.mean。特别地,这意味着返回标量的调用可能会返回一个 0 维的子类对象。

结构化数组的多字段操作

在 1.13 版中,涉及多个字段的结构化数组的行为将以两种方式发生变化:

首先,在 1.13 版中对具有多个字段的结构化数组进行索引(例如,arr[['f1', 'f3']])将返回原始数组的视图,而不是副本。注意返回的视图将具有原始数组中的中间字段对应的额外填充字节,不同于 1.12 中的副本,这将影响诸如arr[['f1', 'f3']].view(newdtype)的代码。

其次,在 numpy 版本 1.6 至 1.12 之间,结构化数组之间的赋值将以“按字段名称”进行:目标数组中的字段将设置为源数组中同名的字段,或者如果源数组中没有该字段,则设置为 0:

>>> a = np.array([(1,2),(3,4)], dtype=[('x', 'i4'), ('y', 'i4')])
>>> b = np.ones(2, dtype=[('z', 'i4'), ('y', 'i4'), ('x', 'i4')])
>>> b[:] = a
>>> b
array([(0, 2, 1), (0, 4, 3)],
 dtype=[('z', '<i4'), ('y', '<i4'), ('x', '<i4')]) 

在 1.13 版中,赋值将以“按位置”进行:目标的第 N 个字段将被设置为源的第 N 个字段,不管字段名称如何。可以通过在赋值之前使用索引对字段重新排序来获得旧的行为,例如,b[['x', 'y']] = a[['y', 'x']]

结构化数组的多字段操作

在 1.13 版中,涉及多个字段的结构化数组的行为将以两种方式发生变化:

首先,使用多个字段的结构化数组进行索引(例如,arr[['f1','f3']])将在 1.13 中返回原始数组的视图,而不是副本。 请注意,返回的视图将具有与原始数组中介入字段对应的额外填充字节,与 1.12 中的副本不同,这将影响诸如arr[['f1','f3']] .view(newdtype)之类的代码。

第二,在 numpy 版本 1.6 到 1.12 之间,结构化数组之间的赋值“按字段名”进行:目标数组中的字段被设置为源数组中同名字段,如果源没有字段,则设置为 0:

>>> a = np.array([(1,2),(3,4)], dtype=[('x', 'i4'), ('y', 'i4')])
>>> b = np.ones(2, dtype=[('z', 'i4'), ('y', 'i4'), ('x', 'i4')])
>>> b[:] = a
>>> b
array([(0, 2, 1), (0, 4, 3)],
 dtype=[('z', '<i4'), ('y', '<i4'), ('x', '<i4')]) 

在 1.13 版本中,赋值将“按位置”进行:目标的第 N 个字段将被设置为源的第 N 个字段,而不考虑字段名称。 可以通过使用索引重新排序字段来获得旧的行为,例如,b[['x','y']] = a[['y','x']]

兼容性注意事项

弃用警告改为错误

  • 用浮点数进行索引引发IndexError,例如,a[0,0.0]。

  • 使用非整数 array_like 进行索引引发IndexError,例如,a['1','2']

  • 使用多个省略号进行索引引发IndexError,例如,a[..., ...]

  • 使用非整数作为索引值引发TypeError,例如,在reshapetake和指定减小轴的地方。

未来警告改为更改的行为

  • 如果未给出 dtype,则np.full现在返回填充值 dtype 的数组,而不是默认为浮点数。

  • 如果参数是 ndarray 的子类,np.average将发出警告,因为从 1.13 开始将保留子类。 (见未来更改)

对于整数的负指数,power**引发错误

先前的行为取决于涉及 numpy 标量整数或 numpy 整数数组。

对于数组

  • 将零求负整数幂将返回最小整数值。

  • 正负 1 都返回了正确的负整数幂。

  • 剩下的整数在提高负整数幂时有时返回零,有时返回正确的浮点数,这取决于整数类型的组合。

对于标量

  • 将零求负整数幂将返回最小整数值。

  • 正负 1 都返回了正确的负整数幂。

  • 剩下的整数有时返回零,有时返回正确的浮点数,具体取决于整数类型的组合。

现在所有这些情况除了那些公共类型为浮点数的整数组合之外都会引发ValueError,例如 uint64 和 int8。人们觉得一个简单的规则比为整数单元制定特殊的例外更好。 如果您需要负指数,请使用不精确的类型。

宽松的步长检查是默认的

这将对假定F_CONTIGUOUSC_CONTIGUOUS互斥,并且可设置为确定现在都是的数组的默认顺序的代码产生一些影响。

对于np.percentile'midpoint'插值方法已修复以匹配准确的索引

当两者相同时,'midpoint'插值器现在给出与'lower'和'higher'相同的结果。 以前的'lower' + 0.5 的行为已修正。

keepdims kwarg 传递给用户类方法

现在,将带有keepdims关键字参数的 numpy 函数的值传递给 ndarray 子类的相应方法。之前,keepdims关键字参数将被静默丢弃。这些函数现在具有以下行为:

  1. 如果用户没有提供keepdims,则不会将任何关键字传递给底层方法。

  2. 任何用户提供的keepdims的值都将作为关键字参数传递给方法。

当方法不支持keepdims关键字参数,并且用户明确传入keepdims时,此操作将引发错误。

下列函数已更改:sumproductsometruealltrueanyallamaxaminprodmeanstdvarnanminnanmaxnansumnanprodnanmeannanmediannanvarnanstd

bitwise_and标识已更改

先前的标识为 1,现在为-1。有关更多解释,请参见改进条目。

当遇到未屏蔽的无效值时,ma.median会发出警告并返回nan

类似于未屏蔽的中位数,ma.median现在在存在未屏蔽的NaN的片段中发出运行时警告并返回NaN

assert_almost_equal中更具一致性

标量的精度检查已更改以匹配数组的精度检查。现在是:

abs(actual - desired) < 1.5 * 10**(-decimal) 

请注意,这比先前记录的更宽松,但与assert_array_almost_equal中使用的先前实现一致。由于实现的更改,一些非常微妙的测试可能会失败,而以前不会失败。

NoseTester测试期间的警告行为

如果给定了raise_warnings="develop",那么所有未捕获的警告现在都将被视为测试失败。之前只有一些警告被引发。没有被捕获或引发的警告(在发布模式下大多数情况下)将在测试周期中显示一次,类似于默认的 python 设置。

assert_warnsdeprecated装饰器更具体

assert_warns函数和上下文管理器现在更具体于给定的警告类别。这种增加的特异性导致它们根据外部警告设置进行处理。这意味着在给定错误类别警告并在上下文之外被忽略的情况下不会引发任何警告。或者增加的特异性可能意味着错误地被忽略的警告现在将被显示或引发。另请参阅新的suppress_warnings上下文管理器。相同的情况也适用于deprecated装饰器。

C API

没有改变。

将 DeprecationWarning 更改为错误

  • 使用浮点数进行索引会引发IndexError,例如,a[0, 0.0]

  • 使用非整数array_like进行索引会引发IndexError,例如,a['1', '2']

  • 使用多个省略号进行索引会引发IndexError,例如,a[..., ...]

  • 使用非整数作为索引值会引发TypeError,例如,在reshapetake和指定减轻轴时。

未来警告以更改行为

  • 如果没有给出 dtype,则np.full现在会返回填充值的 dtype 数组,而不会默认为浮点数。

  • 如果参数是 ndarray 的子类,np.average将发出警告,因为从 1.13 版开始将保留子类。(请参阅未来更改)

对整数取负整数次幂时,power**会引发错误。

以前的行为取决于涉及 numpy 标量整数还是 numpy 整数数组。

对于数组

  • 零取负整数次幂时返回最小的整数值。

  • 1 和-1 都取负整数次幂都返回正确的值。

  • 剩余整数取负整数次幂时返回零。

对于标量

  • 零取负整数次幂时返回最小的整数值。

  • 1 和-1 都取负整数次幂都返回正确的值。

  • 剩余整数有时返回零,有时根据整数类型组合返回正确的浮点数。

这些情况现在全部引发ValueError,除了那些整数组合的常见类型为浮点数的情况,例如 uint64 和 int8。我们认为,简单的规则是最好的选择,而不是对整数单位进行特殊的例外处理。如果需要负数次幂,请使用不精确类型。

宽松的步幅检查是默认值。

这将对假设F_CONTIGUOUSC_CONTIGUOUS互斥并且可以设置为确定现在两者都是数组默认顺序的代码产生一些影响。

np.percentile的“中点”插值方法已修复为确切索引

当“中点”插值器与“低点”和“高点”重合时,现在提供相同的结果。修复了“低点"+0.5 的前期行为。

keepdims关键字参数传递给用户类方法。

传递keepdims关键字参数的 numpy 函数现在会将该值传递给 ndarray 子类对应的方法。以前keepdims关键字参数会被静默丢弃。这些函数现在有以下行为:

  1. 如果用户没有提供keepdims,则不会向底层方法传递关键字。

  2. 任何用户提供的keepdims值都将作为关键字参数传递给方法。

在方法不支持keepdims关键字参数,并且用户明确传递keepdims的情况下,将引发异常。

以下函数已更改:sumproductsometruealltrueanyallamaxaminprodmeanstdvarnanminnanmaxnansumnanprodnanmeannanmediannanvarnanstd

bitwise_and的标识已更改

以前的标识是 1,现在是-1。有关更多解释,请参阅改进条目。

当未掩码的无效值遇到时,ma.median 会发出警告并返回 nan。

类似于未掩码的中位数,掩码中位数ma.median现在在存在未掩码NaN的切片中发出运行时警告并返回NaN

assert_almost_equal中的一致性更大

对标量的精度检查已更改为匹配数组的精度检查。现在是:

abs(actual - desired) < 1.5 * 10**(-decimal) 

请注意,这比以前的文档要宽松,但与以前在 assert_array_almost_equal 中使用的实现一致。由于实现的改变,一些非常微妙的测试可能会失败,而以前则不会失败。

NoseTester 在测试过程中对警告的行为

当给定 raise_warnings="develop" 时,所有未捕获的警告现在都会被视为测试失败。以前只有选定的警告会被提出。未捕获或提出的警告(主要是在发布模式下)将在测试周期内显示一次,类似于默认的 Python 设置。

assert_warnsdeprecated 修饰器更具体

assert_warns 函数和上下文管理器现在更具体于给定的警告类别。增加的特异性导致它们根据外部警告设置进行处理。这意味着在给出并在上下文之外被忽略的情况下可能不会提出警告。另外,增加的特异性可能意味着之前错误被忽略的警告现在将被显示或提出。另请参阅新的 suppress_warnings 上下文管理器。对于 deprecated 修饰器也是如此。

C API

没有变化。

新特性

as_stridedwriteable 关键字参数

np.lib.stride_tricks.as_strided 现在具有一个 writeable 关键字参数。当不希望对返回的数组进行写操作时,可以将其设置为 False,以避免意外的不可预测的写入。

rot90axes 关键字参数

rot90 中的 axes 关键字参数确定了数组旋转的平面。默认为 axes=(0,1),与原始函数相同。

泛化的 flip

flipudfliplr 反转数组元素沿 axis=0 和 axis=1 分别。新添加的 flip 函数沿任何给定轴反转数组元素。

  • np.count_nonzero 现在具有一个 axis 参数,允许在不仅仅是平坦数组对象上生成非零计数。

NumPy 中的 BLIS 支持

现在支持使用 BLIS 库提供的 BLAS 实现构建。请参阅 NumPy 存储库或源分发包根目录中的 site.cfg.example 中的 [blis] 部分。

numpy/__init__.py 中添加挂钩以运行特定于分发的检查

NumPy 的二进制分发可能需要在 NumPy 初始化期间运行特定硬件检查或加载特定库。例如,如果我们将带有要求 SSE2 指令的 BLAS 库的 NumPy 进行分发,我们希望检查 NumPy 运行的计算机是否具有 SSE2,以便提供有意义的错误信息。

numpy/__init__.py 中添加一个挂钩以导入 numpy/_distributor_init.py 文件,该文件将保持空白(除了一个文档字符串)在标准的 NumPy 源中,但在制作 NumPy 的二进制分发时可以被覆盖。

添加了新的 NaN 函数 nancumsumnancumprod

添加了 NaN 函数 nancumsumnancumprod 来计算 cumsumcumprod 时忽略 NaN 值。

np.interp现在可以插值复数值

np.lib.interp(x, xp, fp)现在允许被插值的数组fp为复数,并且将以complex128精度进行插值。

添加了新的多项式评估函数polyvalfromroots

新函数polyvalfromroots在多项式的根处计算多项式。这对于高阶多项式很有用,在机器精度下扩展为多项式系数是不准确的。

添加了新的数组创建函数geomspace

新函数geomspace生成几何序列。它类似于logspace,但直接指定了起始点和终止点:geomspace(start, stop)的行为与logspace(log10(start), log10(stop))相同。

用于测试警告的新上下文管理器

测试工具中添加了一个新的上下文管理器suppress_warnings。这个上下文管理器旨在帮助可靠地测试警告。特别是为了可靠地过滤/忽略警告。在 Python 版本在 3.4.x 之前使用“ignore”过滤器来忽略警告可能很快导致这些(或类似的)警告无法可靠地进行测试。

这个上下文管理器允许过滤(以及记录)类似于catch_warnings上下文的警告,但更容易具体化。同时打印未被过滤的警告或嵌套上下文管理器将按预期工作。此外,当多个测试需要隐藏相同的警告时,将上下文管理器用作装饰器可能非常有用。

新的遮罩数组函数ma.convolvema.correlate添加

这些函数包装了非遮罩版本,但会通过遮罩传播。有两种不同的传播模式。默认情况下,遮罩值会使结果受到遮罩的污染,但另一种模式只有在没有其他选择时才会输出遮罩。

新的float_power ufunc

新的float_power ufunc 类似于power函数,只是所有计算都以 float64 的最低精度进行。在 numpy 邮件列表上长时间讨论了如何处理整数和负整数幂的选项,而一个常见的建议是__pow__运算符应该始终返回至少 float64 精度的结果。float_power函数实现了该选项。请注意,它不支持对象数组。

np.loadtxt现在支持将单个整数作为usecol参数

现在可以使用usecol=n来读取文件的第 n 列,而不是使用usecol=(n,)。当将非整数传递为列索引时,错误消息更加用户友好。

改进了histogram的自动化 bin 估计器

通过bins参数向histogram添加了‘doane’和‘sqrt’估计器。增加了对自动 bin 估计的范围限制直方图的支持。

np.roll现在可以同时滚动多个轴

rollshiftaxis参数现在相互广播,并相应地移动每个指定的轴。

为 ndarrays 实现了__complex__方法

对大小为 1 的数组调用 complex() 现在将转换为 Python 复数。

现在支持pathlib.Path对象

标准的 np.loadnp.savenp.loadtxtnp.savez 和类似函数现在可以接受pathlib.Path对象作为参数,而不仅仅是文件名或打开的文件对象。

np.finfo的新bits属性

这使np.finfo与已经具有该属性的np.iinfo一致。

np.vectorize 的新signature参数

此参数允许以 NumPy 的广义通用函数的风格向量化用户定义的具有核心维度的函数。这允许对更广泛的函数类进行向量化。例如,可以使用signature='(n),(n)->()'向量化结合两个向量产生标量的任意距离度量。有关完整详情,请参阅np.vectorize

发出整数数组除法的 py3k 警告

为了帮助人们将他们的代码基从 Python 2 迁移到 Python 3,python 解释器有一个方便的选项 -3,它会在运行时发出警告。其中一个警告是关于整数除法的:

$ python -3 -c "2/3"

-c:1: DeprecationWarning: classic int division 

在 Python 3 中,新的整数除法语义也适用于 numpy 数组。使用此版本,numpy 将发出类似的警告:

$ python -3 -c "import numpy as np; np.array(2)/np.array(3)"

-c:1: DeprecationWarning: numpy: classic int division 

numpy.sctypes 现在在 Python3 上也包括 bytes

在 Python2 中,它包括 str(字节)和 unicode,但在 Python3 中仅包括 str(unicode)。

as_stridedwriteable关键字参数

np.lib.stride_tricks.as_strided现在具有一个writeable关键字参数。当不希望对返回的数组进行意外的不可预测的写操作时,可以将其设置为 False。

rot90axes关键字参数

rot90 中的axes关键字参数确定了数组旋转的平面。它默认为axes=(0,1),与原始函数相同。

广义翻转

flipudfliplr 在 axis=0 和 axis=1 上分别沿数组反转元素。新添加的 flip 函数沿任何给定的轴反转数组元素。

  • 现在np.count_nonzero具有一个axis参数,允许在非扁平化的数组对象上生成非零计数。

numpy.distutils 中的 BLIS 支持

现在支持使用 BLIS 库提供的 BLAS 实现进行构建。参见numpy存储库或源分发的根目录中的site.cfg.example中的[blis]部分。

钩入numpy/__init__.py以运行特定于分布的检查

对于 numpy 的二进制分布,可能需要在 numpy 初始化期间运行特定的硬件检查或加载特定的库。例如,如果我们将 numpy 与需要 SSE2 指令的 BLAS 库进行分发,我们希望检查运行 numpy 的机器是否具有 SSE2,以便提供有用的错误信息。

numpy/__init__.py中添加了一个钩子来导入一个numpy/_distributor_init.py文件,该文件将在标准 numpy 源码中仅保留一个 docstring,但是可以被制作 numpy 的二进制发行版的人所覆盖。

添加了新的 nan 函数nancumsumnancumprod

添加了忽略 nan 的nancumsumnancumprod函数来计算cumsumcumprod

np.interp现在可以插值复数数值。

np.lib.interp(x, xp, fp)现在允许被插值的数组fp是复数,并且将以complex128的精度进行插值。

添加了用于多项式求值的新函数polyvalfromroots

新的函数polyvalfromroots在给定多项式的根的点上求多项式值。这对于高阶多项式很有用,在机器精度下展开成多项式系数是不准确的。

添加了新的数组创建函数geomspace

新的函数geomspace生成几何序列。它类似于logspace,但直接指定了起始点和结束点:geomspace(start, stop)logspace(log10(start), log10(stop))的行为相同。

用于测试警告的新上下文管理器

测试工具中添加了一个新的上下文管理器suppress_warnings。这个上下文管理器旨在帮助可靠地测试警告。特别是可靠地过滤/忽略警告。在 Python 3.4.x 之前的版本中使用“ignore”筛选器来忽略警告可能很快导致这些(或类似的)警告在测试中得不到可靠的测试。

这个上下文管理器允许过滤(以及记录)类似于catch_warnings上下文的警告,但允许更容易地具体化。未过滤的警告也会像预期的那样打印,或者嵌套这个上下文管理器也会按预期工作。另外,当多个测试需要隐藏相同的警告时,将上下文管理器用作装饰器也可能很有用。

添加了新的掩盖数组函数ma.convolvema.correlate

这些函数包装了非掩盖版本,但会传播掩盖值。有两种不同的传播模式。默认情况下,掩盖值会使结果受到掩盖的影响,但是另一种模式只有在没有其他选择时才输出掩盖。

新的float_powerufunc

新的float_powerufunc 类似于power函数,只不过所有计算都至少以 float64 的精度进行。numpy 邮件列表上讨论了如何处理整数的负整数幂,一个流行的提案是__pow__操作符应该始终返回至少 float64 精度的结果。float_power函数实现了这个选项。请注意,它不支持对象数组。

np.loadtxt现在支持作为usecol参数的单个整数

不再需要使用usecol=(n,)来读取文件的第 n 列,现在可以使用usecol=n。当将非整数作为列索引传递时,错误消息更加用户友好。

改进了histogram的自动 bin 估算器

通过bins参数在histogram中添加了‘doane’和‘sqrt’估算器。增加了对自动 bin 估算的范围受限直方图的支持。

np.roll现在可以同时滚动多个轴

rollshiftaxis参数现在可以互相广播,并且每个指定的轴相应地被移动。

ndarrays 现在实现了__complex__方法

对大小为 1 的数组调用complex()现在将转换为 Python 复数。

现在支持pathlib.Path对象

标准的np.loadnp.savenp.loadtxtnp.savez以及类似的函数现在可以接受pathlib.Path对象作为参数,而不是文件名或打开的文件对象。

np.finfo新增了bits属性

这使得np.finfonp.iinfo保持了一致。

np.vectorize新增了signature参数

这个参数允许对核心维度进行矢量化,以类似于 NumPy 的广义通用函数的风格。这允许对更广泛的函数类进行矢量化。例如,一个结合两个向量产生标量的任意距离度量可以使用signature='(n),(n)->()'进行矢量化。详细信息请参见np.vectorize

对于整数数组的除法发出 py3kwarnings

为了帮助人们将他们的代码库从 Python 2 迁移到 Python 3,python 解释器现在有一个方便的选项-3,可以在运行时发出警告。其中之一的警告是关于整数除法:

$ python -3 -c "2/3"

-c:1: DeprecationWarning: classic int division 

在 Python 3 中,新的整数除法语义也适用于 numpy 数组。在这个版本中,numpy 将发出类似的警告:

$ python -3 -c "import numpy as np; np.array(2)/np.array(3)"

-c:1: DeprecationWarning: numpy: classic int division 

numpy.sctypes 现在在 Python3 上也包括 bytes

以前在 Python2 上包括 str(bytes)和 unicode,但在 Python3 上只包括 str(unicode)。

改进

bitwise_and的标识改变了

以前的标识是 1,导致在使用 reduce 方法时除了 LSB 之外的所有位都被掩码掉。新的标识是-1,在补码机器上应该能正常工作,因为所有位都将被设置为 1。

Generalized Ufuncs 现在可以解除 GIL

广义 ufuncs,包括大部分 linalg 模块,现在将解锁 Python 全局解释器锁。

np.fft中的缓存现在总大小和项目计数受到限制

np.fft中加速连续相同长度 FFT 的缓存现在不能无限增长。它们已被 LRU(最近最少使用)缓存取代,如果达到内存大小或项目计数限制,则会自动清除不再需要的项目。

改进了零宽度字符串/unicode dtypes 的处理

修复了明确禁止具有零宽度字符串 dtype(即dtype('S0')dtype('U0'))的数组的多个接口,并且修复了不正确处理此类 dtype 的几个错误。特别是,在创建新数组时,将ndarray.__new__更改为不会将dtype('S0')隐式转换为dtype('S1')(对于 unicode 也是如此)。

整数 ufunc 矢量化为 AVX2

如果 cpu 在运行时支持,基本整数 ufunc 现在将使用 AVX2 指令。此功能目前仅在使用 GCC 编译时可用。

np.einsum中的操作顺序优化

np.einsum现在支持optimize参数,该参数将优化收缩顺序。例如,np.einsum将在单次传递中完成链 dot 示例 np.einsum(‘ij,jk,kl->il’, a, b, c),它的规模如N⁴;但是,当optimize=True时,np.einsum将创建一个中间数组将此规模减少到或有效地np.dot(a, b).dot(c)。已将使用中间张量来减少规模应用于一般的 einsum 求和表示法。有关更多详细信息,请参阅np.einsum_path

quicksort 已更改为 introsort

np.sortnp.argsort的 quicksort 类型现在是一种 introsort,它是常规的 quicksort,但是在没有取得足够进展时改变为 heapsort。这样保留了良好的 quicksort 性能,同时将最坏情况的运行时间从O(N²)变为O(N*log(N))

ediff1d性能改进和子类处理

ediff1d 函数使用一个数组而不是一个扁平的迭代器进行减法。当 to_begin 或 to_end 不为 None 时,执行就地减法以消除复制操作。一个副作用是更好地处理某些子类,即 astropy.Quantity,因为创建完整数组,包装然后设置开始和结束值,而不是使用连接。

改进了 float16 数组的ndarray.mean的精度

现在用 float32 进行 float16 数组的平均值计算以提高精度。这在 Theano 等包中应该是有用的,其中 float16 的精度是足够的,其较小的占用空间是可取的。

bitwise_and身份已更改

以前的身份是 1,结果是在使用 reduce 方法时除了 LSB 之外的所有位都被屏蔽掉。新的身份是-1,这在补码机器上应该能正常工作,因为所有位都将被设置为 1。

广义的 ufuncs 现在将解锁 GIL

广义的 Ufuncs,包括大部分 linalg 模块,现在将解锁 Python 全局解释器锁。

np.fft中的缓存现在在总大小和项目计数上受到限制

np.fft中加速相同长度连续 FFT 的缓存现在不能无限增长。它们已被替换为 LRU(最近最少使用)缓存,如果达到内存大小或项目计数限制,它们将自动驱逐不再需要的项目。

改进了零宽度字符串/unicode dtypes 的处理

修复了多个明确禁止具有零宽字符串 dtypes(即 dtype('S0')dtype('U0'))数组的接口,并修复了几个未正确处理此类 dtypes 的错误。具体而言,改变了 ndarray.__new__,在创建新的数组时不再自动将 dtype('S0') 转换为 dtype('S1')(对于 Unicode 也是如此)。

使用 AVX2 矢量化的整数 ufuncs

如果 CPU 在运行时支持基本整数 ufuncs 现在使用 AVX2 指令。目前,此功能仅在使用 GCC 编译时可用。

np.einsum 中的操作顺序优化

np.einsum 现在支持 optimize 参数,该参数将优化压缩的顺序。例如,np.einsum 将在单次通过中完成链点示例 np.einsum('ij,jk,kl->il', a, b, c),其缩放类似于 N⁴;但是,当 optimize=True 时,np.einsum 将创建一个中间数组,将此缩放减少到 或有效地 np.dot(a, b).dot(c)。为了减少扩展,已经应用了使用中间张量的一般 einsum 求和符号。有关更多详细信息,请参见 np.einsum_path

快速排序已更改为内省排序

现在 np.sortnp.argsort 的快速排序种类是内省排序,它是常规快速排序,但在没有足够的进展时转换为堆排序。这保留了优秀的快速排序性能,同时将最坏情况的运行时间从 O(N²) 更改为 O(N*log(N))

ediff1d 提高了性能和子类处理

ediff1d 函数使用数组而不是扁平迭代器进行减法。当 to_begin 或 to_end 不为 None 时,将就地执行减法以消除复制操作。一个副作用是更好地处理某些子类,即 astropy.Quantity,因为创建完整数组、封装然后设置开始和结束值,而不是使用 concatenate。

改善了浮点 16 位数组的 ndarray.mean 函数的精度

现在,浮点 16 位数组的平均值计算是在 float32 中执行,以提高精度。这在像 Theano 这样的包中应该很有用,因为 float16 的精度是足够的,并且其较小的占用空间是可取的。

变化

现在,在 fromnumeric.py 中所有类似数组的方法都使用关键字参数调用

内部上,在 fromnumeric.py 中的许多类似数组的方法被用位置参数而不是它们的外部签名中使用的关键字参数调用。这导致了下游的 ‘pandas' 库遇到了与 ‘numpy' 兼容性的问题。现在,此模块中的所有类似数组的方法都使用关键字参数调用。

在大多数情况下,对 np.memmap 对象的操作返回 numpy 数组

以前对 memmap 对象的操作会误导地返回一个 memmap 实例,即使结果实际上并不是 memmapped。例如,arr + 1arr + arr 会返回 memmap 实例,尽管输出数组的内存并没有被映射。版本 1.12 从这些操作中返回普通的 numpy 数组。

此外,memmap 的减少(例如.sum(axis=None)现在返回一个 numpy 标量,而不是 0d memmap。

警告的 stacklevel 增加了

Python 基于警告的 stacklevel 被增加,以便大多数警告将报告用户代码的冒犯行,而不是警告本身被给出的行。通过测试来确保新的警告将接收stacklevel参数。

这导致“default”或“module”筛选器的警告在每次冒犯的用户代码行或用户模块上只显示一次,而不是仅显示一次。在 3.4 之前的 Python 版本中,这可能会导致以前被错误忽略的警告出现,这可能会在测试套件中特别令人惊讶。

fromnumeric.py 中的所有类似数组的方法现在都使用关键字参数调用

内部上,fromnumeric.py 中的许多类似数组的方法被呼叫时使用了位置参数,而不是像它们的外部签名所做的那样使用了关键字参数。这导致“pandas”库中遇到了一个与“numpy”兼容性问题的复杂性。现在,这个模块中的所有类似数组的方法都使用关键字参数调用。

np.memmap 对象的操作在大多数情况下返回 numpy 数组

以前对 memmap 对象的操作会误导地返回一个 memmap 实例,即使结果实际上并不是 memmapped。例如,arr + 1arr + arr 会返回 memmap 实例,尽管输出数组的内存并没有被映射。版本 1.12 从这些操作中返回普通的 numpy 数组。

此外,memmap 的减少(例如.sum(axis=None)现在返回一个 numpy 标量,而不是 0d memmap。

警告的 stacklevel 增加了

Python 基于警告的 stacklevel 被增加,以便大多数警告将报告用户代码的冒犯行,而不是警告本身被给出的行。通过测试来确保新的警告将接收stacklevel参数。

这导致“default”或“module”筛选器的警告在每次冒犯的用户代码行或用户模块上只显示一次,而不是仅显示一次。在 3.4 之前的 Python 版本中,这可能会导致以前被错误忽略的警告出现,这可能会在测试套件中特别令人惊讶。

NumPy 1.11.3 版本说明

原文:numpy.org/doc/1.26/release/1.11.3-notes.html

Numpy 1.11.3 修复了在使用追加模式打开非常大的文件时导致文件损坏的 bug。它支持 Python 2.6 - 2.7 和 3.2 - 3.5 版本。可以在 PyPI 上找到 Linux、Windows 和 OS X 版本的安装包。

维护 1.11.3 的贡献者

共有 2 人为此版本做出了贡献。名字后带有“+”的人是首次为此版本贡献了补丁。

  • Charles Harris

  • Pavel Potocek +

合并的拉取请求

  • #8341: BUG: 修复了使用追加模式时ndarray.tofile导致大文件损坏的问题。

  • #8346: TST: 修复了 NumPy 1.11.x 版本中 PR #8341 的测试

维护 1.11.3 版本的贡献者

共有 2 人为此版本做出了贡献。名字后带有“+”的人是首次为此版本贡献了补丁。

  • Charles Harris

  • Pavel Potocek +

合并的拉取请求

  • #8341: BUG: 修复了ndarray.tofile在 NumPy 1.11.x 版本中的测试问题。

  • #8346: TST: 修复了 NumPy 1.11.x 版本中 PR #8341 的测试

Numpy 1.11.2 发布说明

原文:numpy.org/doc/1.26/release/1.11.2-notes.html

Numpy 1.11.2 支持 Python 2.6 - 2.7 和 3.2 - 3.5。它修复了 Numpy 1.11.1 中发现的错误和回归,并包括几个构建相关的改进。可以在 PyPI 上找到 Linux、Windows 和 OS X 的安装包。

已合并的拉取请求

后续合并覆盖的修复和发布说明更新被省略。

  • 7736 BUG:许多函数悄悄丢弃 ‘keepdims’ 关键字参数。

  • 7738 ENH:为许多 MA 方法添加额外的关键字参数并更新文档。

  • 7778 DOC:更新 Numpy 1.11.1 发布说明。

  • 7793 BUG:MaskedArray.count 错误处理负轴。

  • 7816 BUG:修复宽数据类型的数组过大错误。

  • 7821 BUG:确保 npy_mul_with_overflow_ 检测溢出。

  • 7824 维护:为空数组分配更少的字节。

  • 7847 MAINT,DOC:修复一些 imp 模块用法并更新 f2py.compile 文档字符串。

  • 7849 MAINT:修复剩余使用废弃 Python imp 模块的情况。

  • 7851 BLD:修复 ATLAS 版本检测。

  • 7896 BUG:从包含填充的 np.array 构建 ma.array。

  • 7904 BUG:由于错误排序,修复 float16 类型未被调用。

  • 7917 BUG:生产安装的 numpy 不应该需要 nose。

  • 7919 BLD:为这个库的最新版本修复了 MKL 检测。

  • 7920 BUG: 修复问题 #7835 (ma.median of 1d)。

  • 7932 BUG:像其他编译器一样,修复 _msvccompile.gen_lib_option 的猴子补丁。

  • 7939 BUG:在 npy_math_complex 中检查 HAVE_LDOUBLE_DOUBLE_DOUBLE_LE。

  • 7953 BUG:防止在通用快速排序中出现错误比较。

  • 7954 BUG:使用关键字参数初始化 Extension 基类。

  • 7955 BUG:确保重新加载后 numpy 全局变量保持不变。

  • 7972 BUG:MSVCCompiler 在 ‘lib’ & ‘include’ 环境字符串指数级增长。

  • 8005 BLD:在 setup.py 的最后从内置变量中移除 NUMPY_SETUP

  • 8010 MAINT:移除剩余的 imp 模块导入。

  • 8020 BUG:修复 np.ma.count 的返回,如果 keepdims 为 True,且 axis 为 None。

  • 8024 BUG:修复 numpy.ma.median。

  • 8031 BUG:修复只有一个非遮罩值的 np.ma.median。

  • 8044 BUG:修复 NpyIter 在不连续数组中的缓冲错误。

已合并的拉取请求

后续合并覆盖的修复和发布说明更新被省略。

  • 7736 BUG:许多函数悄悄丢弃 ‘keepdims’ 关键字参数。

  • 7738 ENH:为许多 MA 方法添加额外的关键字参数并更新文档。

  • 7778 DOC:更新 Numpy 1.11.1 发布说明。

  • 7793 BUG:MaskedArray.count 错误处理负轴。

  • 7816 BUG:修复宽数据类型的数组过大错误。

  • 7821 BUG:确保 npy_mul_with_overflow_ 检测溢出。

  • 7824 维护:为空数组分配更少的字节。

  • 7847 MAINT,DOC:修复一些 imp 模块用法并更新 f2py.compile 文档字符串。

  • 7849 MAINT:修复剩余使用废弃 Python imp 模块的情况。

  • 7851 BLD:修复 ATLAS 版本检测。

  • 7896 BUG:从包含填充的 np.array 构建 ma.array。

  • 7904 BUG:由于错误排序,修复 float16 类型未被调用。

  • 7917 BUG:生产安装的 numpy 不应该需要 nose。

  • 7919 BLD: 为这个库的最新版本修复了 MKL 检测。

  • 7920 BUG: 修复问题 #7835 (ma.median of 1d)。

  • 7932 BUG: 像其他编译器一样修补 _msvccompile.gen_lib_option。

  • 7939 BUG: 检查 npy_math_complex 中的 HAVE_LDOUBLE_DOUBLE_DOUBLE_LE。

  • 7953 BUG: 在通用快速排序中防止错误的比较。

  • 7954 BUG: 使用关键字参数来初始化 Extension 基类。

  • 7955 BUG: 确保 numpy 全局变量在重新加载后保持一致。

  • 7972 BUG: MSVCCompiler 在‘lib’和‘include’环境字符串指数增长。

  • 8005 BLD: 在 setup.py 结尾从内置中移除 NUMPY_SETUP

  • 8010 MAINT: 移除残留的 imp 模块导入。

  • 8020 BUG: 修复 np.ma.count 的返回,如果 keepdims 为 True 且 axis 为 None。

  • 8024 BUG: 修复 numpy.ma.median。

  • 8031 BUG: 修复只有一个非屏蔽值的 np.ma.median。

  • 8044 BUG: 修复 NpyIter 在不连续数组中的缓冲 bug。

NumPy 1.11.1 发行说明

原文:numpy.org/doc/1.26/release/1.11.1-notes.html

Numpy 1.11.1 支持 Python 2.6 - 2.7 和 3.2 - 3.5。它修复了在 Numpy 1.11.0 中发现的 bug 和回归,并包括了几个与构建相关的改进。可以在 PyPI 上找到 Linux、Windows 和 OSX 的安装包。

修复已合并

  • 7506 BUG: 确保在没有 nose 的情况下,numpy 在 python 2.6 上导入是可用的。

  • 7530 BUG: 在 np.lexsort 中无效轴导致浮点异常。

  • 7535 BUG: 将 glibc 复数三角函数拉黑名单扩展至 glibc < 2.18。

  • 7551 BUG: 允许对没有编译器的优雅恢复。

  • 7558 BUG: 常量填充预期的类型在 constant_values 中错误。

  • 7578 BUG: 修复 Python 3.x 中的 OverflowError。在 swig 接口中。

  • 7590 BLD: 修复 configparser.InterpolationSyntaxError。

  • 7597 BUG: 使 np.ma.take 在标量上工作。

  • 7608 BUG: linalg.norm(): 不要将对象数组转换为浮点数。

  • 7638 BLD: 在 system_info.py 中正确的 C 编译器自定义。

  • 7654 BUG: 1 维数组的 ma.median 应返回标量。

  • 7656 BLD: 移除硬编码的英特尔编译器标志 -xSSE4.2。

  • 7660 BUG: 对对象字段类型进行临时修复以用于 str(mvoid)。

  • 7665 BUG: 修正了 1D 掩码数组的错误打印。

  • 7670 BUG: 直方图中初始索引估计的修正。

  • 7671 BUG: 当转移需要 API 时,布尔赋值不释放 GIL。

  • 7676 BUG: 修复最终直方图箱右边缘处理的问题。

  • 7680 BUG: 修复了在 Visual Studio 2015 中 np.clip 中 NaN 处理的 bug。

  • 7724 BUG: 修复了 np.random.shuffle 中的 segfaults。

  • 7731 MAINT: 将 mkl_info.dir_env_var 从 MKL 更改为 MKLROOT。

  • 7737 BUG: 修复了 OS X 上使用 Python 3.x 时的问题,npymath.ini 未安装。

修复已合并

  • 7506 BUG: 确保在没有 nose 的情况下,numpy 在 python 2.6 上导入是可用的。

  • 7530 BUG: 在 np.lexsort 中无效轴导致浮点异常。

  • 7535 BUG: 将 glibc 复数三角函数拉黑名单扩展至 glibc < 2.18。

  • 7551 BUG: 允许对没有编译器的优雅恢复。

  • 7558 BUG: 常量填充预期的类型在 constant_values 中错误。

  • 7578 BUG: 修复 Python 3.x 中的 OverflowError。在 swig 接口中。

  • 7590 BLD: 修复 configparser.InterpolationSyntaxError。

  • 7597 BUG: 使 np.ma.take 在标量上工作。

  • 7608 BUG: linalg.norm(): 不要将对象数组转换为浮点数。

  • 7638 BLD: 在 system_info.py 中正确的 C 编译器自定义。

  • 7654 BUG: 1 维数组的 ma.median 应返回标量。

  • 7656 BLD: 移除硬编码的英特尔编译器标志 -xSSE4.2。

  • 7660 BUG: 对对象字段类型进行临时修复以用于 str(mvoid)。

  • 7665 BUG: 修正了 1D 掩码数组的错误打印。

  • 7670 BUG: 直方图中初始索引估计的修正。

  • 7671 BUG: 当转移需要 API 时,布尔赋值不释放 GIL。

  • 7676 BUG: 修复最终直方图箱右边缘处理的问题。

  • 7680 BUG: 修复了在 Visual Studio 2015 中 np.clip 中 NaN 处理的 bug。

  • 7724 BUG: 修复了 np.random.shuffle 中的 segfaults。

  • 7731 MAINT: 将 mkl_info.dir_env_var 从 MKL 更改为 MKLROOT。

  • 7737 BUG: 修复了 OS X 上使用 Python 3.x 时的问题,npymath.ini 未安装。

NumPy 1.11.0 发布说明

原文:numpy.org/doc/1.26/release/1.11.0-notes.html

此版本支持 Python 2.6 - 2.7 和 3.2 - 3.5,并包含许多增强和改进。请注意下面列出的构建系统更改,因为它们可能会产生微妙的影响。

由于工具链损坏,此版本不提供 Windows (TM) 二进制文件。Python 包的提供者之一是您的最佳选择。

亮点

可在下面找到这些改进的详细信息。

  • datetime64 类型现在是时区无关的。

  • randint 中添加了一个 dtype 参数。

  • 改进了可能共享内存的两个数组的检测。

  • np.histogram 的自动 bin 大小估计。

  • 优化 A @ A.T 和 dot(A, A.T) 的速度。

  • 新函数 np.moveaxis 用于重新排序数组轴。

构建系统更改

  • Numpy 现在使用 setuptools 进行构建,而不是普通的 distutils。这修复了依赖于 Numpy 的项目的 setup.py 文件中使用 install_requires='numpy' 的问题(参见 gh-6551)。尽管如此,这可能会影响 Numpy 本身的构建/安装方法的行为。请在 Numpy 问题跟踪器上报告任何意外行为。

  • Bento 构建支持和相关文件已被移除。

  • 单文件构建支持和相关文件已被移除。

未来的更改

下列更改计划在 Numpy 1.12.0 中进行。

  • 将放弃对 Python 2.6、3.2 和 3.3 的支持。

  • 放宽步幅检查将成为默认设置。有关此更改意味着什么的更详细讨论,请参阅 1.8.0 发布说明。

  • datetime64 的“not a time” (NaT) 值的行为将更改,以匹配浮点数的“not a number” (NaN) 值的行为:涉及 NaT 的所有比较将返回 False,除了 NaT != NaT 将返回 True。

  • 使用浮点数进行索引将引发 IndexError,例如,a[0, 0.0]。

  • 使用非整数数组索引将引发 IndexError,例如,a['1', '2']

  • 使用多个省略号进行索引将引发 IndexError,���如,a[..., ...]

  • 使用非整数作为索引值将引发 TypeError,例如,在 reshapetake 和指定 reduce 轴时。

在未来的版本中将进行以下更改。

  • numpy.testing 中暴露的 rand 函数将被移除。该函数是早期 Numpy 遗留下来的,使用了 Python 的 random 模块实现。应改用 numpy.random 中的随机数生成器。

  • ndarray.view 方法现在只允许查看 c_contiguous 数组,使用不同大小的 dtype 会导致最后一个维度改变。这与当前行为不同,当前行为允许查看 f_contiguous 但不是 c_contiguous 的数组,使用不同大小的 dtype 会导致第一个维度改变。

  • MaskedArray 切片将返回数据 掩码的视图。目前,掩码是写时复制的,对切片中掩码的更改不会传播到原始掩码。有关详细信息,请参阅下面的 FutureWarnings 部分。

兼容性说明

datetime64 更改

在 NumPy 先前的版本中,实验性 datetime64 类型总是在 UTC 中存储时间。默认情况下,创建 datetime64 对象时,从字符串转换或打印会从本地时间转换:

# old behavior
>>> np.datetime64('2000-01-01T00:00:00')
numpy.datetime64('2000-01-01T00:00:00-0800')  # note the timezone offset -08:00 

datetime64 用户的一致意见认为这种行为是不可取的,与 datetime64 通常的使用方式不符(例如,pandas 的使用方式)。对于大多数用例,更喜欢时区不明确的 datetime 类型,类似于 Python 标准库中的 datetime.datetime 类型。因此,datetime64 不再假定输入为本地时间,也不再打印本地时间:

>>> np.datetime64('2000-01-01T00:00:00')
numpy.datetime64('2000-01-01T00:00:00') 

为了向后兼容,datetime64 仍然解析时区偏移量,并通过转换为 UTC 处理。但是,生成的日期时间是时区不明确的:

>>> np.datetime64('2000-01-01T00:00:00-08')
DeprecationWarning: parsing timezone aware datetimes is deprecated;
this will raise an error in the future
numpy.datetime64('2000-01-01T08:00:00') 

作为对此更改的推论,我们不再禁止在具有日期单位和时间单位的日期时间之间进行强制转换。对于时区不明确的日期时间,从日期到时间的转换规则不再模棱两可。

linalg.norm 返回类型更改

linalg.norm 函数的返回类型现在总是浮点数,没有例外。以前有些范数类型返回整数。

多项式拟合更改

numpy 多项式包中的各种拟合函数不再接受非整数的度数规定。

np.dot 现在引发 TypeError 而不是 ValueError

此行为模仿 np.inner 等其他函数的行为。如果两个参数不能转换为通用类型,可能会引发 TypeErrorValueError,取决于它们的顺序。现在,np.dot 现在将始终引发 TypeError

未来警告以更改行为

  • np.lib.split 中,结果中的空数组的维度始终为 (0,),无论被拆分的数组的维度如何。现在已更改为保留维度。自 Numpy 1.9 以来一直存在对此更改的 FutureWarning,但是,由于 bug,有时不会出现警告,并且维度已经得到保留。

%// 运算符

这些运算符分别使用 remainderfloor_divide 函数实现。这些函数现在基于 fmod 并一起计算,以使其与浮点类型的 Python 版本和彼此兼容。与以前的结果相比,结果应该稍微更准确或完全修复程序错误,但在舍入使整数的差异很重要的情况下,结果可能差异显着。一些特殊情况也发生了变化,例如,当除数为零时,两个函数始终返回 NaN,divmod(1.0, inf) 返回 (0.0, 1.0),除了 MSVC 2008 之外,divmod(-1.0, inf) 返回 (-1.0, inf)

C API

删除了PyUFuncObject结构体的check_returninner_loop_selector成员(用reserved槽位替换以保留结构布局)。它们从未被用于任何东西,因此很少有第三方代码使用它们,但为了完整起见,我们在这里提到它。

旧样式类的对象 dtype 检测

在 python 2 中,旧样式用户定义的类的实例不再自动计算为‘object’类型在 dtype 检测处理程序中。与 python 3 一样,它们可能潜在地计算为序列,但只有在它们同时定义了一个__len__和一个__getitem__方法时。这修复了 python 2 和 3 之间的 segfault 和不一致性。

新功能

  • np.histogram现在提供了插件估计器,用于自动估计最佳的直方图数。将[‘auto’, ‘fd’, ‘scott’, ‘rice’, ‘sturges’]之一作为‘bins’参数的参数传递,将使用相应的估计器。

  • 添加了一个使用Airspeed Velocity的基准套件,将之前基于 vbench 的套件进行转换。您可以通过 python runtests.py --bench 在本地运行套件。更多细节请查看benchmarks/README.rst

  • 添加了一个新的函数np.shares_memory,可以精确检查两个数组是否存在内存重叠。现在np.may_share_memory也有一个选项,可以花费更多的精力来减少误报。

  • SkipTestKnownFailureException异常类在numpy.testing命名空间中暴露。在测试函数中引发它们,以标记测试被跳过,或者标记它为已知的失败。

  • f2py.compile现在有一个新的extension关键字参数,允许为生成的临时文件指定 Fortran 扩展名。例如,可以指定文件为*.f90verbose参数也已激活,以前被忽略。

  • 已将np.random.randint添加了一个dtype参数,现在可以生成以下类型的随机 ndarrays:

    • np.bool_,

    • np.int8, np.uint8,

    • np.int16, np.uint16,

    • np.int32, np.uint32,

    • np.int64, np.uint64,

    • np.int_ ``, ``np.intp

    规范是通过精度而不是通过 C 类型来定义的。因此,在一些平台上,即使指定的 dtype 是long longnp.int64可能是long而不是long long,因为两者可能具有相同的精度。生成的数组类型取决于 numpy 为给定精度使用的 C 类型。字节顺序规范也被忽略,生成的数组总是采用本机字节顺序。

  • 一个新的np.moveaxis函数允许通过明确提供源和目标轴来移动一个或多个数组轴到新位置。这个函数应该比当前的rollaxis函数更容易使用,并提供更多的功能。

  • 各种numpy.polynomial拟合的deg参数已扩展为接受要包含在拟合中的项的度数列表,所有其他项的系数被约束为零。这个改变是向后兼容的,传递一个标量deg将像以前一样运行。

  • 为浮点类型添加了一个类似于 Python 版本的 divmod 函数到 npy_math 库。

改进

np.gradient现在支持axis参数

为了一致性,np.gradient添加了axis参数。它允许指定计算梯度的轴。

np.lexsort现在支持具有对象数据类型的数组

当类型不实现一种合并排序的argsort方法时,该函数现在内部调用通用的npy_amergesort

np.ma.core.MaskedArray现在支持order参数

在构造新的MaskedArray实例时,可以配置一个order参数,类似于调用np.ndarray时的参数。添加此参数允许在几个与 MaskedArray 相关的实用函数中正确处理order参数,如np.ma.core.arraynp.ma.core.asarray

对掩码数组的内存和速度改进

使用mask=True(或mask=False)创建一个掩码数组现在使用np.ones(或`np.zeros)创建掩码,这样更快,避免了大内存峰值。另一个优化是避免在打印掩码数组时出现内存峰值和无用计算。

ndarray.tofile现在在 linux 上使用 fallocate

该函数现在使用fallocate系统调用来在支持它的文件系统上保留足够的磁盘空间。

优化形式为A.T @ AA @ A.T的操作

以前,所有矩阵乘积都使用gemm BLAS 操作。现在,如果矩阵乘积是矩阵和其转置之间的乘积,它将使用syrk BLAS 操作以提高性能。这种优化已扩展到@numpy.dotnumpy.innernumpy.matmul

注意:需要转置和非转置矩阵共享数据。

np.testing.assert_warns现在可以用作上下文管理器

这与assert_raises的行为相匹配。

np.random.shuffle提速

np.random.shuffle现在对于 1d ndarrays 快得多。

变更

numpy.distutils中移除了对 Pyrex 的支持

方法build_src.generate_a_pyrex_source将保持可用;用户已经对其进行了 monkeypatch 以支持 Cython 而不是 Pyrex。建议切换到更受支持的构建 Cython 扩展的方法。

np.broadcast现在可以用一个参数调用

在这种情况下得到的对象将简单地模拟对单个数组的迭代。这种改变使得像

如果 len(x) == 1:

形状 = x[0].shape

否则:

形状 = np.broadcast(*x).shape

可以在所有情况下使用np.broadcast

np.trace现在尊重数组子类

此行为模仿了其他函数(如np.diagonal)的行为,并确保对于蒙版数组np.trace(ma)ma.trace()产生相同的结果。

np.dot现在引发TypeError而不是ValueError

此行为模仿了其他函数(如np.inner)的行为。如果两个参数无法转换为公共类型,它可能会引发TypeErrorValueError,具体取决于它们的顺序。现在,np.dot现在将始终引发TypeError

linalg.norm的返回类型更改

linalg.norm函数现在所有计算都以浮点数进行,并返回浮点结果。这种更改修复了由于整数溢出和绝对值在最小值的有符号整数(例如 int8(-128))时失败所导致的错误。为了一致性,即使整数可能有效,也会使用浮点数。

弃用

在 Fortran 顺序中的数组视图

F_CONTIGUOUS 标志用于表示使用改变了元素大小的数据类型的视图将改变第一个索引。对于既是 F_CONTIGUOUS 又是 C_CONTIGUOUS 的数组,这总是有问题的,因为 C_CONTIGUOUS 会优先。放宽步幅检查会导致更多这样的双连续数组,并因此破坏一些现有代码。请注意,这也影响了通过将数组的 dtype 属性分配给 dtype 来更改 dtype。此次弃用的目的是在将来的某个时间限制视图只能 C_CONTIGUOUS 数组。向后兼容的解决方法是使用a.T.view(...).T。也可以向视图方法添加参数,以显式要求 Fortran 顺序视图,但这不会向后兼容。

数组排序的无效参数

目前可以在像array.flattenarray.ravel方法的order参数中传递不是以下之一的参数:"C"、"F"、"A"、"K"(注意,所有这些可能的值都是 unicode 且大小写不敏感的)。在以后的版本中将不允许这种行为。

testing命名空间中的随机数生成器

Python 标准库中的随机数生成器以前在testing命名空间中作为testing.rand公开。不建议使用此生成器,并且将在以后的版本中删除。请改用numpy.random命名空间中的生成器。

闭区间上的随机整数生成

符合 Python C API 的规定,它优先选择半开区间而不是闭区间,np.random.random_integers正在被弃用,而更倾向于调用已经根据“新功能”中描述的dtype参数进行增强的np.random.randint。然而,np.random.random_integers不会很快被移除。

FutureWarnings

MaskedArray的切片/视图分配

目前,遮蔽数组的切片包含原始数据的视图以及掩码的写时复制视图。因此,对切片掩码的任何更改都将导致复制原始掩码并更改该新掩码而不是原始掩码。例如,如果我们这样制作原始数组的切片,view = original[:],那么对一个数组的数据进行的更改会影响另一个数组的数据,但是由于掩码在赋值操作过程中将被复制,所以掩码的更改将保持在本地。当显式使用 MaskedArray(data, mask) 构造遮蔽数组时,也会出现类似情况,返回的数组将包含对 data 的视图,但掩码将是对 mask 的写时复制视图。

在未来,这些情况将被规范化,以便数据和掩码数组被同样对待,并且对任一方的修改将在视图之间传播。在 1.11 版本中,当用户代码修改将来可能导致值传播回原始值的视图的掩码时,numpy 将发出 MaskedArrayFutureWarning 警告。为了消除这些警告并使您的代码针对即将到来的更改更稳健, 有两种选择:如果您想保持当前行为,请在修改掩码之前调用 masked_view.unshare_mask()。如果您想提前获得未来的行为,请使用 masked_view._sharedmask = False。但是,请注意, 设置_sharedmask属性将使随后对masked_view.unshare_mask()的显式调用被打破。

亮点

这些改进的详细信息可以在下面找到。

  • datetime64 类型现在是无时区的。

  • randint 添加了一个 dtype 参数。

  • 改进了检测两个数组可能共享内存的方法。

  • np.histogram 的自动 bin 大小估算。

  • A @ A.Tdot(A, A.T) 进行了速度优化。

  • 用于重新排序数组轴的新函数 np.moveaxis

构建系统变更

  • Numpy 现在在构建时使用 setuptools 而不是普通的 distutils。这修复了在 Numpy 依赖项目的 setup.py 文件中使用 install_requires='numpy' 的问题 (详情见 gh-6551)。尽管它潜在地影响了 Numpy 本身的构建/安装方法的行为。请在 Numpy 问题跟踪器上报告任何未预期的行为。

  • Bento 构建支持和相关文件已被移除。

  • 单文件构建支持和相关文件已被移除。

未来更改

以下更改计划在 Numpy 1.12.0 版中实施。

  • 将放弃对 Python 2.6、3.2 和 3.3 的支持。

  • 放松的步幅检查将成为默认设置。有关此更改意味着什么的更长讨论,请参阅 1.8.0 版发行说明。

  • datetime64 的“非时间”(NaT)值的行为将更改以匹配浮点数的“非数字”(NaN)值的行为: 所有涉及 NaT 的比较都将返回 False,除非 NaT != NaT 将返回 True。

  • 使用浮点数进行索引将引发 IndexError,例如a[0, 0.0]

  • 使用非整数的 array_like 进行索引将引发 IndexError,例如a['1', '2']

  • 使用多个省略号进行索引将引发IndexError,例如,a[..., ...]

  • 用作索引值的非整数将引发TypeError,例如,在reshape中,take中指定减少轴。

在未来的发行版中将进行以下更改。

  • 将在numpy.testing中公开的rand函数将被移除。该函数是早期 NumPy 遗留下来的,并使用 Python 随机模块实现。应该使用numpy.random中的随机数生成器。

  • ndarray.view方法现在只允许以不同大小的dtype查看c_contiguous数组,导致最后一个维度的改变。这与当前行为不同,当前行为中,f_contiguous但不是c_contiguous的数组可以以不同大小的dtype查看,导致第一个维度的改变。

  • 切片MaskedArray将返回数据和掩码的视图。目前,掩码是写时复制的,对切片中掩码的更改不会传播到原始掩码。有关详细信息,请参见下面的FutureWarnings部分。

兼容性注意事项

datetime64的更改

在 NumPy 的先前版本中,实验性的datetime64类型始终以 UTC 时区存储时间。默认情况下,从字符串创建datetime64对象或打印它将转换为或从本地时间转换:

# old behavior
>>> np.datetime64('2000-01-01T00:00:00')
numpy.datetime64('2000-01-01T00:00:00-0800')  # note the timezone offset -08:00 

一致的datetime64用户一致认为这种行为是不可取的,与datetime64通常的用法不一致(例如,通过pandas)。在大多数用例中,时区无关的日期时间类型更受欢迎,类似于 Python 标准库中的datetime.datetime类型。因此,datetime64不再假设输入为本地时间,也不会打印本地时间:

>>> np.datetime64('2000-01-01T00:00:00')
numpy.datetime64('2000-01-01T00:00:00') 

为了向后兼容,datetime64仍然解析时区偏移量,并通过转换为 UTC 来处理。然而,生成的datetime是时区无关的:

>>> np.datetime64('2000-01-01T00:00:00-08')
DeprecationWarning: parsing timezone aware datetimes is deprecated;
this will raise an error in the future
numpy.datetime64('2000-01-01T08:00:00') 

作为这一变化的必然结果,我们不再禁止在具有日期单位和具有时间单位的日期时间之间进行转换。对于时区无关的日期时间,从日期到时间的转换规则不再模棱两可。

linalg.norm返回类型的更改

linalg.norm函数的返回类型现在总是浮点型,不再异常。以前一些范数类型返回的是整数。

多项式拟合的改变

numpy 多项式包中的各种拟合函数不再接受非整数作为度规格。

np.dot现在引发TypeError而不是ValueError

这种行为模仿了其他函数(如np.inner)的行为。如果两个参数无法转换为公共类型,它可能会根据它们的顺序引发TypeErrorValueError。现在,np.dot将始终引发TypeError

未来版本中的更改警告

  • np.lib.split 中,结果中的空数组始终具有维度 (0,),无论要拆分的数组的维度如何。现在已更改为保留维度。自 Numpy 1.9 以来,对此更改设置了 FutureWarning,但由于 bug 的存在,会有时没有触发警告并且维度已经被保留。

%// 运算符

这些运算符分别使用 remainderfloor_divide 函数实现。这些函数现在都基于 fmod 并一起计算,以使其与浮点类型的 Python 版本和彼此兼容。结果应该在某些情况下更准确或纠正错误,但在舍入会影响 floor_divide 返回的整数的情况下,结果可能会有显著不同。一些特殊情况也会发生变化,例如,当除数为零时,这两个函数总是返回 NaN, divmod(1.0, inf) 返回 (0.0, 1.0) 除了在 MSVC 2008 上,divmod(-1.0, inf) 返回 (-1.0, inf)

C API

移除了 PyUFuncObject 结构的 check_returninner_loop_selector 成员(用 reserved slots 替代以保持结构布局)。这些成员以前从未被使用过,因此很少有第三方代码使用它们,但我们为完整起见在这里提到它们。

旧式类的对象 dtype 检测

在 python 2 中,旧式用户定义的类的实例不再自动计为 ‘object’ 类型。与 python 3 一样,它们可能潜在地计为序列,但只有当它们定义了 __len____getitem__ 方法时。这修复了出现的 segfault 以及 python 2 和 3 之间的不一致性。

datetime64 的更改

在先前的 NumPy 版本中,实验性的 datetime64 类型总是以 UTC 时间存储时间。默认情况下,从字符串创建 datetime64 对象或打印它将从本地时间转换:

# old behavior
>>> np.datetime64('2000-01-01T00:00:00')
numpy.datetime64('2000-01-01T00:00:00-0800')  # note the timezone offset -08:00 

一致的 datetime64 用户一致认为这种行为是不可取的,与 datetime64 的通常用法相矛盾(例如,由pandas使用)。对于大多数用例来说,更喜欢时区不明确的 datetime 类型,类似于 Python 标准库中的 datetime.datetime 类型。因此,datetime64 不再假定输入是本地时间,也不会打印本地时间:

>>> np.datetime64('2000-01-01T00:00:00')
numpy.datetime64('2000-01-01T00:00:00') 

为了向后兼容,datetime64 仍解析时区偏移量,它通过转换为 UTC 来处理。然而,生成的 datetime 是没有时区信息的:

>>> np.datetime64('2000-01-01T00:00:00-08')
DeprecationWarning: parsing timezone aware datetimes is deprecated;
this will raise an error in the future
numpy.datetime64('2000-01-01T08:00:00') 

作为这种更改的必然结果,我们不再禁止在具有日期单位和时间单位的 datetimes 之间转换。对于时区不明确的 datetime,从日期到时间的转换规则不再模棱两可。

linalg.norm 返回类型更改

linalg.norm 函数的返回类型现在总是浮点型,不会有异常。以前的部分范数类型以前返回整数。

多项式拟合更改

numpy 多项式包中的各种拟合函数现在不再接受非整数作为度规范。

np.dot 现在引发 TypeError 而不是 ValueError

此行为模拟了 np.inner 等其他函数的行为。如果两个参数无法转换为公共类型,它可能会引发 TypeErrorValueError,具体取决于它们的顺序。现在,np.dot 现在总是会引发 TypeError

未来改变行为的警告

  • np.lib.split 中,结果中的空数组无论数组被分割的维度如何,其维度始终为 (0,)。现在已更改为保留维度。尽管 Numpy 1.9 以来已发出此更改的 FutureWarning,但由于错误,有时没有引发警告并且维度已被保留。

%// 运算符

这些运算符分别用 remainderfloor_divide 函数实现。这些函数现在基于 fmod 进行计算,并一起进行计算,以便与浮点类型的 Python 版本以及彼此兼容。与以前的结果相比,结果应该稍微更加准确或者纠正错误,但在舍入导致 floor_divide 返回的整数不同的情况下,它们可能会有显著不同的差异。一些边界情况也会改变,例如,当除数为零时,NaN 总是同时返回给这两个函数,divmod(1.0, inf) 除了 MSVC 2008 以外总是返回 (0.0, 1.0),并且 divmod(-1.0, inf) 返回 (-1.0, inf)

C API

删除了 PyUFuncObject 结构体的 check_returninner_loop_selector 成员(用 reserved 槽来保留结构布局)。这些成员从未用于任何用途,因此第三方代码不太可能使用它们,但出于完整性考虑我们在这里提到了它们。

旧式类的对象类型检测

在 python 2 中,旧式用户定义类的实例对象不再自动计为 ‘object’ 类型,而是可能计为序列,仅当它们定义了 *__len__**__getitem__* 方法时。这修复了 python 2 和 3 之间的分歧和一致性。

新特性

  • np.histogram 现在提供插件估计器,用于自动估算最佳的箱数。将 [‘auto’, ‘fd’, ‘scott’, ‘rice’, ‘sturges’] 中的一个作为 ‘bins’ 参数传递给 np.histogram 将会使用相应的估计器。

  • 添加了一个使用 Airspeed Velocity 的基准套件,来替代之前的基于 vbench 的套件。您可以通过 python runtests.py --bench 在本地运行套件。更多详情,请参见 benchmarks/README.rst

  • 添加了一个新的函数 np.shares_memory,可以确切地检查两个数组是否存在内存重叠。np.may_share_memory 现在也可以选择更多努力来减少误报。

  • SkipTestKnownFailureException 异常类在 numpy.testing 命名空间中公开。在测试函数中引发它们以标记要跳过的测试或将其标记为已知的失败。

  • f2py.compile 现在有一个新的 extension 关键字参数,可以指定生成的临时文件的 Fortran 扩展名。例如,可以将文件指定为 *.f90verbose 参数也被激活,以前被忽略。

  • np.random.randint 添加了一个 dtype 参数,现在可以生成以下类型的随机 ndarrays:

    • np.bool_

    • np.int8np.uint8

    • np.int16np.uint16

    • np.int32np.uint32

    • np.int64np.uint64

    • np.int_ ``, ``np.intp

    规范是按精度而不是按 C 类型。因此,在一些平台上,即使指定的 dtype 是 long longnp.int64 可能是一个 long 而不是 long long,因为两者可能具有相同的精度。生成的类型取决于 numpy 为给定精度使用的 C 类型。字节顺序规范也被忽略,生成的数组始终以本机字节顺序。

  • 新的 np.moveaxis 函数允许通过显式提供源和目标轴将一个或多个数组轴移动到新的位置。该函数应该比当前的 rollaxis 函数更容易使用,并提供更多的功能。

  • 各种 numpy.polynomial 拟合的 deg 参数已扩展为接受除拟合中包括的项的度数列表之外的所有其他项的系数限制为零。该更改向后兼容,传递一个标量 deg 将与以前的行为相同。

  • 根据 Python 版本添加了一个针对 float 类型的 divmod 函数到 npy_math 库。

改进

np.gradient 现在支持一个 axis 参数

axis 参数已添加到 np.gradient 中以保持一致性。它允许指定计算梯度的轴。

现在,np.lexsort 支持具有对象数据类型的数组。

当类型没有实现一个归并排序类型的 argsort 方法时,该函数现在内部调用通用的 npy_amergesort

np.ma.core.MaskedArray 现在支持一个 order 参数。

当构建一个新的 MaskedArray 实例时,可以使用类似于调用 np.ndarray 时的 order 参数进行配置。添加此参数允许在许多与 MaskedArray 相关的实用函数(如 np.ma.core.arraynp.ma.core.asarray)中正确处理 order 参数。

遮罩数组的内存和速度改进

使用 mask=True(即 mask=False)创建遮罩数组现在使用 np.ones(即 np.zeros)创建遮罩,这样可以更快地创建遮罩,并避免了大的内存峰值。还进行了另一个优化,避免在打印遮罩数组时产生内存峰值和无用的计算。

ndarray.tofile 现在在 Linux 上使用 fallocate。

该函数现在使用 fallocate 系统调用在支持它的文件系统上预留足够的磁盘空间。

对于形式为 A.T @ AA @ A.T 的操作进行了优化

以前,所有矩阵乘积都使用 gemm BLAS 操作。现在,如果矩阵乘积是矩阵和它的转置之间的话,将使用 syrk BLAS 操作进行性能提升。这项优化已扩展到 @numpy.dotnumpy.innernumpy.matmul

注意: 需要转置和非转置的矩阵共享数据。

np.testing.assert_warns 现在可以作为上下文管理器使用

这与 assert_raises 的行为相匹配。

np.random.shuffle 的速度提升

np.random.shuffle 现在对于 1 维 ndarrays 要快得多。

np.gradient 现在支持 axis 参数

np.gradient 添加了 axis 参数以实现一致性。它允许指定计算梯度的轴。

np.lexsort 现在支持具有对象数据类型的数组

该函数现在在类型不实现合并排序种类 argsort 方法时内部调用通用的 npy_amergesort

np.ma.core.MaskedArray 现在支持 order 参数。

当构造一个新的MaskedArray实例时,可以配置一个与调用np.ndarray时类似的 order 参数。添加这个参数允许在几个与 MaskedArray 相关的实用函数中(比如 np.ma.core.arraynp.ma.core.asarray)正确处理 order 参数。

对于蒙版数组的内存和速度改进

创建一个带有 mask=True(或 mask=False)的蒙版数组现在使用np.ones(或 np.zeros)来创建蒙版,这样更快且避免了大量的内存峰值。在打印蒙版数组时,还进行了另一个优化,避免了内存峰值和无用的计算。

ndarray.tofile 现在在 Linux 上使用 fallocate

该函数现在使用 fallocate 系统调用,在支持它的文件系统上预留足够的磁盘空间。

对于形式为 A.T @ AA @ A.T 的操作进行了优化

以前,所有矩阵乘积都使用 gemm BLAS 操作。现在,如果矩阵乘积是矩阵和它的转置之间的话,将使用 syrk BLAS 操作进行性能提升。这项优化已扩展到 @numpy.dotnumpy.innernumpy.matmul

注意: 需要转置和非转置的矩阵共享数据。

np.testing.assert_warns 现在可以作为上下文管理器使用

这与 assert_raises 的行为相匹配。

np.random.shuffle 的速度提升

np.random.shuffle 现在对于 1 维 ndarrays 要快得多。

变更

numpy.distutils 中移除了对 Pyrex 的支持

方法build_src.generate_a_pyrex_source 将保持可用;用户已将其 monkeypatched 以支持 Cython 而不是 Pyrex。但是建议切换到更受支持的构建 Cython 扩展的方法。

np.broadcast 现在可以用单个参数调用。

在这种情况下,生成的对象将简单地模仿对单个数组的迭代。这种更改使得诸如以下的区别已经过时。

如果长度为 1,则:

形状 = x[0].shape

其他情况:

形状 = np.broadcast(*x).shape

可以在所有情况下都使用np.broadcast

np.trace现在尊重数组子类。

这种行为模仿了其他函数(如np.diagonal)的行为,确保了对于掩码数组np.trace(ma)ma.trace()给出相同的结果。

np.dot现在引发TypeError错误,而不是ValueError错误。

这种行为模仿了其他函数(如np.inner)的行为。如果这两个参数无法转换为相同的类型,则它可能会引发TypeErrorValueError错误,具体取决于它们的顺序。现在,np.dot将始终引发TypeError错误。

linalg.norm返回类型发生变化

现在,linalg.norm函数在浮点运算中进行所有计算,并返回浮点结果。这一改变修复了因整数溢出和带有最小值的有符号整数(例如,int8(-128))与 abs 失败而引起的错误。为了保持一致性,甚至可能适用整数的地方也使用浮点数。

numpy.distutils中删除了对 Pyrex 的支持。

方法build_src.generate_a_pyrex_source将继续可用;用户已经对其进行了修改,以支持 Cython 而不是 Pyrex。建议转换为更受支持的构建 Cython 扩展的方法。

现在可以使用单个参数调用np.broadcast

在这种情况下,生成的对象将简单地模仿对单个数组的迭代。这种更改使得诸如以下的区别已经过时。

如果长度为 1,则:

形状 = x[0].shape

其他情况:

形状 = np.broadcast(*x).shape

可以在所有情况下都使用np.broadcast

np.trace现在尊重数组子类。

这种行为模仿了其他函数(如np.diagonal)的行为,确保了对于掩码数组np.trace(ma)ma.trace()给出相同的结果。

np.dot现在引发TypeError错误,而不是ValueError错误。

这种行为模仿了其他函数(如np.inner)的行为。如果这两个参数无法转换为相同的类型,则它可能会引发TypeErrorValueError错误,具体取决于它们的顺序。现在,np.dot将始终引发TypeError错误。

linalg.norm返回类型发生变化

现在,linalg.norm函数在浮点运算中进行所有计算,并返回浮点结果。这一改变修复了因整数溢出和带有最小值的有符号整数(例如,int8(-128))与 abs 失败而引起的错误。为了保持一致性,甚至可能适用整数的地方也使用浮点数。

弃用

数组的 Fortran 顺序视图

F_CONTIGUOUS 标志用于表示使用更改了元素大小的 dtype 的视图将更改第一个索引。对于同时具有 F_CONTIGUOUS 和 C_CONTIGUOUS 的数组,这总是有问题的,因为 C_CONTIGUOUS 优先。放宽步幅检查会导致更多这样的双连续数组,并因此破坏一些现有代码。请注意,这也会影响通过将数组的 dtype 赋值给 dtype 属性来更改 dtype。此弃用的目的是在将来的某个时候将视图限制为 C_CONTIGUOUS 数组。一个向后兼容的解决方法是改用 a.T.view(...).T。也可以向 view 方法添加一个参数,显式要求 Fortran 顺序视图,但这不会向后兼容。

数组排序的无效参数

目前可以在诸如 array.flattenarray.ravel 等方法的 order 参数中传入不是以下之一的参数:‘C’、‘F’、‘A’、‘K’(请注意,所有这些可能的值都是 Unicode 和大小写不敏感的)。在未来的版本中将不允许这种行为。

testing 命名空间中的随机数生成器

Python 标准库中的随机数生成器之前在 testing 命名空间中作为 testing.rand 暴露出来。不建议使用此生成器,并将在未来的版本中移除。请改用 numpy.random 命名空间中的生成器。

在闭区间上生成随机整数

根据 Python C API 的规定,优先选择半开区间而不是闭区间,np.random.random_integers 将被弃用,推荐使用带有 dtype 参数的 np.random.randint,详见“新特性”。然而,np.random.random_integers 不会很快被移除。

以 Fortran 顺序的数组视图

F_CONTIGUOUS 标志用于表示使用更改了元素大小的 dtype 的视图将更改第一个索引。对于同时具有 F_CONTIGUOUS 和 C_CONTIGUOUS 的数组,这总是有问题的,因为 C_CONTIGUOUS 优先。放宽步幅检查会导致更多这样的双连续数组,并因此破坏一些现有代码。请注意,这也会影响通过将数组的 dtype 赋值给 dtype 属性来更改 dtype。此弃用的目的是在将来的某个时候将视图限制为 C_CONTIGUOUS 数组。一个向后兼容的解决方法是改用 a.T.view(...).T。也可以向 view 方法添加一个参数,显式要求 Fortran 顺序视图,但这不会向后兼容。

数组排序的无效参数

目前可以在诸如 array.flattenarray.ravel 等方法的 order 参数中传入不是以下之一的参数:‘C’、‘F’、‘A’、‘K’(请注意,所有这些可能的值都是 Unicode 和大小写不敏感的)。在未来的版本中将不允许这种行为。

testing命名空间中的随机数生成器

Python 标准库中的随机数生成器之前在testing命名空间中作为testing.rand暴露。不建议使用此生成器,并且它将在未来的版本中被移除。请改用numpy.random命名空间中的生成器。

在闭区间上生成随机整数

符合 Python C API 的规范,该 API 更倾向于半开区间而不是闭区间,因此np.random.random_integers将被弃用,推荐使用np.random.randint,该函数已经增加了dtype参数,详情请参见“新功能”。但是,np.random.random_integers不会很快被移除。

未来警告

MaskedArray的切片/视图赋值

目前,掩码数组的切片包含原始数据的视图和掩码的写时复制视图。因此,对切片掩码的任何更改都将导致原始掩码的副本被制作,并且新掩码被更改而不是原始掩码。例如,如果我们这样对原始数据进行切片,view = original[:],那么对一个数组中数据的修改将影响另一个数组的数据,但是,因为掩码在赋值操作期间被复制,对掩码的更改将保持在本地。当显式使用MaskedArray(data, mask)构造掩码数组时,返回的数组将包含data的视图,但掩码将是mask的写时复制视图。

未来,这些情况将被规范化,使数据和掩码数组以相同的方式处理,并且对任一者的修改将在视图之间传播。在 1.11 版本中,当用户代码修改视图的掩码时,numpy 将发出MaskedArrayFutureWarning警告,这可能导致值传播回原始数据。为了消除这些警告并使您的代码能够应对即将到来的更改,您有两个选择:如果想保持当前行为,请在修改掩码之前调用masked_view.unshare_mask()。如果想提前获得未来行为,请使用masked_view._sharedmask = False。但是,请注意,设置_sharedmask属性将会破坏对masked_view.unshare_mask()的后续显式调用。

MaskedArray的切片/视图赋值

目前,一个掩码数组的切片包含原始数据的视图和掩码的写时复制视图。因此,对切片掩码的任何更改都将导致对原始掩码的副本进行更改,而不是对原始掩码进行更改。例如,如果我们这样对原始数据进行切片,view = original[:],那么对一个数组中数据的修改将影响另一个数组的数据,但是,因为掩码在赋值操作期间将被复制,对掩码的更改将保持局部。当明确使用MaskedArray(data, mask)构造掩码数组时,类似的情况发生,返回的数组将包含data的视图,但掩码将是mask的写时复制视图。

在未来,这些情况将被规范化,以便数据和掩码数组被同样对待,并且对任一数组的修改将在视图之间传播。在 1.11 版本中,当用户代码修改将来可能导致值传播回原始数据的视图的掩码时,numpy 将发出MaskedArrayFutureWarning警告。为了消除这些警告并使您的代码针对即将到来的更改更加健壮,您有两个选择:如果想保持当前行为,调用masked_view.unshare_mask(),然后再修改掩码。如果想提前获得未来的行为,使用masked_view._sharedmask = False。但是,请注意,设置_sharedmask属性将破坏随后对masked_view.unshare_mask()的显式调用。

posted @ 2024-06-24 14:54  绝不原创的飞龙  阅读(7)  评论(0编辑  收藏  举报