NumPy 1.17.5 版本发布说明
本版本包含了针对 NumPy 1.17.4 报告的 bug 的修复,以及一些构建改进。本版本支持的 Python 版本为 3.5-3.8。
下游开发者应该使用 Cython >= 0.29.14 来支持 Python 3.8,并且使用 OpenBLAS >= 3.7 来避免在 Skylake 架构上出现错误。
建议对新的随机比特生成器感兴趣的开发人员升级到 NumPy 1.18.x 系列,因为它具有更新的文档和许多小的改进。
贡献者
此版本共有 6 人为其做出了贡献。名字前带“+”号的人第一次贡献了一个补丁。
-
Charles Harris
-
Eric Wieser
-
Ilhan Polat
-
Matti Picus
-
Michael Hudson-Doyle
-
Ralf Gommers
合并的拉取请求
此版本共合并了 8 个拉取请求。
-
#14593:MAINT:将 Cython API 清理工作回退到 1.17.x,移除文档
-
#14937:BUG:修复处理数组的 ndmin 参数时的整数大小混淆
-
#14939:BUILD:从 numpy.random 构建中删除 SSE2 标志
-
#14993:MAINT:向 dll lib discovery 添加 Python3.8 分支
-
#15038:BUG:修复 ufunc 对象循环中的引用计数
-
#15067:BUG:异常轨迹被丢弃了
-
#15175:ENH:将测试函数的改进重申到前面。
-
#15213:REL:为 NumPy 1.17.5 版本做准备。
贡献者
此版本共有 6 人为其做出了贡献。名字前带“+”号的人第一次贡献了一个补丁。
-
Charles Harris
-
Eric Wieser
-
Ilhan Polat
-
Matti Picus
-
Michael Hudson-Doyle
-
Ralf Gommers
合并的拉取请求
此版本共合并了 8 个拉取请求。
-
#14593:MAINT:将 Cython API 清理工作回退到 1.17.x,移除文档
-
#14937:BUG:修复处理数组的 ndmin 参数时的整数大小混淆
-
#14939:BUILD:从 numpy.random 构建中删除 SSE2 标志
-
#14993:MAINT:向 dll lib discovery 添加 Python3.8 分支
-
#15038:BUG:修复 ufunc 对象循环中的引用计数
-
#15067:BUG:异常轨迹被丢弃了
-
#15175:ENH:将测试函数的改进重申到前面。
-
#15213:REL:为 NumPy 1.17.5 版本做准备。
NumPy 1.17.4 发布说明
本次发布包含针对 NumPy 1.17.3 报告的错误以及一些构建改进的修复。这个发布支持的 Python 版本是 3.5-3.8。
下游开发者应使用 Cython >= 0.29.13 来支持 Python 3.8,使用 OpenBLAS >= 3.7 以避免在 Skylake 架构上的错误。
亮点
-
修复了
random.random_integers
有偏差的生成 8 位和 16 位整数。 -
修复了* np.einsum *在 Power9 和 z/Linux 上的回归。
-
修复了有符号整数数组的直方图问题。
贡献者
这次发布共有 5 位贡献者。名字后带有“+”的是第一次贡献修补程序的人。
-
Charles Harris
-
克里斯·巴尔 +
-
Matti Picus
-
孙启明 +
-
Warren Weckesser
合并的拉取请求
本次发布合并了 8 个拉取请求。
-
#14758: BLD:声明支持 python 3.8
-
#14781: BUG:随机:从 8 位或 16 位整数中获得有偏差的样本…
-
#14851: BUG:修复 _ctypes 类的循环引用。(#13808)
-
#14852: BLD:在 shippable 中添加“apt update”
-
#14855: BUG:修复* np.einsum *在 Power9 Linux 和 z/Linux 上的错误
-
#14857: BUG:lib:修复有符号整数数组的直方图问题。
-
#14858: BLD:防止-flto 优化长双精度表示…
-
#14866: 维护:将 buffer.h -> npy_buffer.h 移动以避免冲突
亮点
-
修复了
random.random_integers
有偏差的生成 8 位和 16 位整数。 -
修复了* np.einsum *在 Power9 和 z/Linux 上的回归。
-
修复了有符号整数数组的直方图问题。
贡献者
这次发布共有 5 位贡献者。名字后带有“+”的是第一次贡献修补程序的人。
-
Charles Harris
-
Chris Burr +
-
Matti Picus
-
孙启明 +
-
Warren Weckesser
合并的拉取请求
本次发布合并了 8 个拉取请求。
-
#14758: BLD:声明支持 python 3.8
-
#14781: BUG:随机:从 8 位或 16 位整数中获得有偏差的样本…
-
#14851: BUG:修复 _ctypes 类的循环引用。(#13808)
-
#14852: BLD:在 shippable 中添加“apt update”
-
#14855: BUG:修复* np.einsum *在 Power9 Linux 和 z/Linux 上的错误
-
#14857: BUG: lib: 修复有符号整数数组的直方图问题。
-
#14858: BLD: 避免 -flto 优化长双精度表示…
-
#14866: MAINT: 将 buffer.h 移动到 npy_buffer.h 以避免冲突
NumPy 1.17.3 版本发布说明
此版本包含了针对 NumPy 1.17.2 报告的 bug 的修复以及一些文档改进。此版本支持的 Python 版本为 3.5-3.8。
下游开发者应使用 Cython >= 0.29.13 来支持 Python 3.8,并使用 OpenBLAS >= 3.7 以避免在 Skylake 架构上出现错误。
亮点
-
Python 3.8 的 Wheels
-
修复了布尔
matmul
,现在使用布尔值而不是整数。
兼容性说明
- 很少使用的
PyArray_DescrCheck
宏已被更改/修复。
贡献者
总共有 7 人为此版本做出了贡献。名字后面带有“+”符号的人第一次贡献了一个补丁。
-
Allan Haldane
-
Charles Harris
-
Kevin Sheppard
-
Matti Picus
-
Ralf Gommers
-
Sebastian Berg
-
Warren Weckesser
合并的拉取请求
总共有 12 个拉取请求合并到了此版本中。
-
#14456: MAINT: 清理 numpy.fft 命名空间中的 pocketfft 模块。
-
#14463: BUG: random.hypergeometric 假设 npy_long 是 npy_int64,挂起…
-
#14502: BUG: random: 撤销 gh-14458 并重新修复 gh-14557。
-
#14504: BUG: 为布尔矩阵乘法添加一个专用循环。
-
#14506: MAINT: 更新 Python 3.8 的 pytest 版本
-
#14512: DOC: random: 修复文档链接,引用了私有子模块。
-
#14513: BUG,MAINT: 基于 clang 分析的修复和小的清理。
-
#14515: BUG: 修复范围为 2**32 时的 randint。
-
#14519: MAINT: 移除熵的 C 扩展模块。
-
#14563: DOC: 移除关于 Pocketfft 许可文件的说明(这里并不存在)。
-
#14578: BUG: random: 创建 random.binomial 的传统实现。
-
#14687: BUG: 正确定义 PyArray_DescrCheck。
亮点
-
Python 3.8 的 Wheels
-
修复了布尔
matmul
,现在使用布尔值而不是整数。
兼容性说明
- 很少使用的
PyArray_DescrCheck
宏已被更改/修复。
贡献者
总共有 7 人为此版本做出了贡献。名字后面带有“+”符号的人第一次贡献了一个补丁。
-
Allan Haldane
-
Charles Harris
-
Kevin Sheppard
-
Matti Picus
-
Ralf Gommers
-
Sebastian Berg
-
Warren Weckesser
合并的拉取请求
总共有 12 个拉取请求合并到了此版本中。
-
#14456: MAINT: 清理 numpy.fft 命名空间中的 pocketfft 模块。
-
#14463: BUG: random.hypergeometric 假设 npy_long 是 npy_int64,挂起…
-
#14502: BUG: random: 撤销 gh-14458 并重新修复 gh-14557。
-
#14504: BUG: 为布尔 matmul 添加一个专门的循环。
-
#14506: MAINT: 更新 Python 3.8 的 pytest 版本。
-
#14512: DOC: random: 修复文档链接,原先引用了私有子模块。
-
#14513: BUG,MAINT: 根据 clang 分析进行一些修复和次要清理。
-
#14515: BUG: 修复 range 为 2**32 时的 randint 问题。
-
#14519: MAINT: 移除熵 C 扩展模块。
-
#14563: DOC: 移除关于 Pocketfft 许可文件的注释(在此处不存在)。
-
#14578: BUG: random: 创建随机二项式的传统实现。
-
#14687: BUG: 正确定义 PyArray_DescrCheck
NumPy 1.17.2 发布说明
这个版本包含针对 NumPy 1.17.1 报告的 bug 的修复以及一些文档改进。最重要的修复是针对 lexsort 当键的类型为 (u)int8 或 (u)int16 时。如果您目前正在使用 1.17 版本,建议升级。
这个版本支持的 Python 版本为 3.5-3.7,Python 2.7 已被弃用。Python 3.8b4 应该可以与发布的源代码包一起工作,但不提供未来支持保证。
下游开发人员应该使用 Cython >= 0.29.13 来支持 Python 3.8,并且使用 OpenBLAS >= 3.7 避免在 Skylake 架构上出现错误。PyPI 上的 NumPy 轮子是从 OpenBLAS 开发分支构建的,以避免这些错误。
贡献者
共有 7 人做出贡献。名字前带有“+”符号的人第一次提交补丁。
-
CakeWithSteak +
-
Charles Harris
-
Dan Allan
-
Hameer Abbasi
-
Lars Grueter
-
Matti Picus
-
Sebastian Berg
合并的拉取请求
共有 8 个拉取请求合并到此版本中。
-
#14418: BUG: 修复 aradixsort 的间接索引。
-
#14420: DOC: 修复分派文档中的一个小错误。
-
#14421: BUG: 测试,修复转换为 ctypes 的回归��题。
-
#14430: BUG: 不在私有错误类中显示 Override 模块。
-
#14432: BUG: 修复 assert_allclose 中的最大相对误差报告。
-
#14433: BUG: 修复使用线性斜坡进行填充时的 uint 溢出问题…
-
#14436: BUG: 更新 1.17.x 版本与 1.18.0-dev pocketfft.py。
-
#14446: REL: 为 NumPy 1.17.2 版本做准备。
贡献者
本次发布共有 7 人做出贡献。名字前带有“+”符号的人第一次提交补丁。
-
CakeWithSteak +
-
Charles Harris
-
Dan Allan
-
Hameer Abbasi
-
Lars Grueter
-
Matti Picus
-
Sebastian Berg
合并的拉取请求
共有 8 个拉取请求(pull requests)合并到此版本中。
-
#14418: BUG: 修复 aradixsort 的间接索引。
-
#14420: DOC: 修复分派文档中的一个小错误。
-
#14421: BUG: 测试,修复转换为 ctypes 时的回归问题。
-
#14430: BUG: 不在私有错误类中显示 Override 模块。
-
#14432: BUG: 修复 assert_allclose 中的最大相对误差报告。
-
#14433: BUG: 修复使用线性斜坡进行填充时的 uint 溢出问题…
-
#14436: BUG: 更新 1.17.x 版本,使用 1.18.0-dev 版本的 pocketfft.py。
-
#14446: REL: 为 NumPy 1.17.2 版本发布做准备。
NumPy 1.17.1 发布说明
本次发布包含一些针对 NumPy 1.17.0 报告的错误的修复,以及一些文档和构建改进。支持的 Python 版本为 3.5-3.7,请注意,Python 2.7 已被删除。Python 3.8b3 应该可以与发布的源代码包一起工作,但未来不做保证。
下游开发者应使用 Cython >= 0.29.13 支持 Python 3.8 和 OpenBLAS >= 3.7 以避免在 Skylake 架构上出现问题。PyPI 上的 NumPy 轮子是从 OpenBLAS 开发分支构建的,以避免出现这些问题。
贡献者
共有 17 人为本次发布做出了贡献。名字后面带有“+”符号的是首次贡献补丁的人。
-
Alexander Jung +
-
Allan Haldane
-
Charles Harris
-
Eric Wieser
-
Giuseppe Cuccu +
-
Hiroyuki V. Yamazaki
-
Jérémie du Boisberranger
-
Kmol Yuan +
-
Matti Picus
-
Max Bolingbroke +
-
Maxwell Aladago +
-
Oleksandr Pavlyk
-
Peter Andreas Entschev
-
Sergei Lebedev
-
Seth Troisi +
-
Vladimir Pershin +
-
Warren Weckesser
合并的 pull request
本次发布共合并了 24 个 pull request。
-
#14156:TST:在测试 strided/non-strided exp/log 循环中允许繁琐性
-
#14157:BUG:avx2_scalef_ps 必须是静态的
-
#14158:BUG:删除在 Python 3.7 上导致 SystemError 的杂乱打印。
-
#14159:BUG:修复 Python 3.8 中的弃用警告。
-
#14160:BLD:将缺失的 gcd/lcm 定义添加到 npy_math.h
-
#14161:DOC, BUILD:清理并修复 ‘build dist’
-
#14166:TST:在 travisCI 测试中添加 3.8-dev。
-
#14194:BUG:移除破损的 clip 封装(后备)
-
#14198:DOC:在 svd 中修复迹 Hermitian 参数的文档。
-
#14199:MAINT:针对因英特尔编译器错误导致测试失败的问题进行解决方法处理
-
#14200:TST:清理 test_pocketfft.py
-
#14201:BUG:使高级索引结果在只读子类中可写…
-
#14236:BUG:修复默认 BitGenerator 名称
-
#14237:ENH:为 np.random 中的冻结分析添加 C 导入模块
-
#14296:TST:将 pytest 版本固定为 5.0.1
-
#14301:BUG:修复 f2py 生成模块初始化中的内存泄漏和 PyMem_Del…
-
#14302:BUG:修复异常消息中的格式错误
-
#14307: 维护:random:将 SeedSequence.pool_size 的类型与 DEFAULT_POOL_SIZE 匹配。
-
#14308: BUG:修复 numpy.random 在平台检测中的错误
-
#14309: ENH:在所有 Linux 构建中启用大页面
-
#14330: BUG:修复
random.permutation(x)
在 x 是字符串时的段错误。 -
#14338: BUG:当对一些空数组进行词法排序时不要失败(#14228)
-
#14339: BUG:修复在各个地方误用 .names 和 .fields(回溯…
-
#14345: BUG:修复在非平凡情况下 structured_to_unstructured 的行为…
-
#14350: REL:准备 1.17.1 发布版
贡献者
总共有 17 人为该版本做出了贡献。带有“+”标记的人第一次贡献了补丁。
-
Alexander Jung +
-
Allan Haldane
-
Charles Harris
-
Eric Wieser
-
Giuseppe Cuccu +
-
Hiroyuki V. Yamazaki
-
Jérémie du Boisberranger
-
Kmol Yuan +
-
Matti Picus
-
Max Bolingbroke +
-
Maxwell Aladago +
-
Oleksandr Pavlyk
-
Peter Andreas Entschev
-
Sergei Lebedev
-
Seth Troisi +
-
Vladimir Pershin +
-
Warren Weckesser
已合并的拉取请求
总共有 24 个拉取请求被合并到这个版本中。
-
#14156: 测试:测试分段/非分段 exp/log 循环允许 fuss
-
#14157: BUG:avx2_scalef_ps 必须是静态的
-
#14158: BUG:移除导致在 python 3.7 上引发 SystemError 的杂乱输出。
-
#14159: BUG:在 python 3.8 中修复 DeprecationWarning。
-
#14160: BLD:将缺少的 gcd/lcm 定义添加到 npy_math.h
-
#14161: 文档,构建:清理和修复(再次) ‘构建分发’
-
#14166: 测试:将 3.8-dev 添加到 travisCI 测试中。
-
#14194: BUG:移除损坏的 clip 包装器(回溯)
-
#14198: 文档:修复 svd 中 hermitian 参数的文档。
-
#14199: 维护:解决导致测试失败的 Intel 编译器错误的临时解决方案
-
#14200: 测试:清理 test_pocketfft.py
-
#14201: BUG:使只读子类上的高级索引结果可写…
-
#14236: BUG:修复默认的 BitGenerator 名称
-
#14237: ENH:为 np.random 中的冻结分析添加 c-导入模块
-
#14296: 测试:将 pytest 版本固定在 5.0.1
-
#14301:BUG:修复了 f2py 生成的模块 init 和PyMem_Del中的泄漏…
-
#14302:BUG:修复了异常消息中的格式错误。
-
#14307:维护:random:将 SeedSequence.pool_size 的类型与 DEFAULT_POOL_SIZE 匹配。
-
#14308:BUG:修复了 numpy.random 在平台检测中的 bug。
-
#14309:ENH:在所有 Linux 构建中启用大页。
-
#14330:BUG:当 x 是字符串时,修复*random.permutation(x)*中的段错误。
-
#14338:BUG:当排序一些空数组时,不要失败(#14228)。
-
#14339:BUG:修复了各个地方对.names 和.fields 的误用(回溯)…
-
#14345:BUG:修复了 structured_to_unstructured 在非平凡情况下的行为…
-
#14350:REL:准备 1.17.1 版本的发布。
NumPy 1.17.0 发布说明
这个 NumPy 版本包含了一些新特性,应该会显著提高其性能和实用性,请参见下面的亮点摘要。支持的 Python 版本为 3.5-3.7,注意 Python 2.7 已经被移除。Python 3.8b2 应该可以与发布的源码包一起工作,但没有未来的保证。
下游开发人员应该使用 Cython >= 0.29.11 来支持 Python 3.8,以及 OpenBLAS >= 3.7(目前还未发布)以避免在 Skylake 架构上出现问题。PyPI 上的 NumPy wheels 是从 OpenBLAS 开发分支构建的,以避免这些问题。
亮点
-
添加了一个新的可扩展的
random
模块,以及四个可选的随机数生成器和改进的种子设计,用于并行进程。当前的可用位生成器有MT19937,PCG64,Philox和SFC64。请参见下面的新特性。 -
NumPy 的
FFT
实现从 fftpack 更改为 pocketfft,导致更快,更准确的变换,并更好地处理素数长度的数据集。请参见下面的改进部分。 -
新的基数排序和 timsort 排序方法。目前不可能选择将使用哪一种。它们被硬编码到数据类型中,并且当
stable
或mergesort
被传递为方法时使用。请参见下面的改进部分。 -
现在默认情况下可以覆盖 numpy 函数,参见下面的
__array_function__
。
新函数
numpy.errstate
现在也是一个函数修饰器。
废弃功能
当传递int
的位置上的float
时,numpy.polynomial
函数会发出警告。
以前,这个模块中的函数会接受float
值,只要它们是整数(1.0
,2.0
等)。为了与 numpy 的其余部分保持一致,此举现在已被弃用,并且在未来将引发TypeError
。
类似地,在整数位置传递0.5
这样的浮点数现在会引发TypeError
而不是以前的ValueError
。
废弃numpy.distutils.exec_command
和temp_file_name
这些函数的内部使用已经进行了重构,并有更好的替代方案。用subprocess.Popen
替换exec_command
,用tempfile.mkstemp
替换temp_file_name
。
C-API 包装数组的可写标志
当从 C-API 创建数组以包装数据指针时,我们唯一可以得知数据读写性质的方式是在创建期间设置writeable
标志。强制将标志设置为可写是危险的。在将来,将不再可能从 python 将writeable
标志切换为True
。此废弃不应影响许多用户,因为以这种方式创建的数组在实践中非常罕见,且仅通过 NumPy C-API 可用。
不应再对 0 维数组调用numpy.nonzero
在 0 维数组上调用numpy.nonzero
的行为令人惊讶,几乎总是不正确的。如果旧的行为是有意的,则可以通过nonzero(atleast_1d(arr))
来保留,而不是nonzero(arr)
,在将来的版本中,这很可能会引发ValueError
。
写入numpy.broadcast_arrays
的结果将会发出警告
通常的numpy.broadcast_arrays
返回一个可写的数组,内部存在重叠,这样写入是不安全的。在将来的版本中,writeable
标志将被设置为False
,并要求用户手动将其设置为True
,如果他们确定这样做是他们想要的。现在写入会发出一个废弃警告,并附有设置writeable
标志True
的说明。请注意,如果在设置之前检查标志,将发现它已经为True
。然而,明确地设置它,正如在将来的版本中所需要的,会清除用于产生废弃警告的内部标志。为了帮助缓解混淆,当访问writeable
标志状态时,会发出额外的FutureWarning来澄清矛盾。
请注意,对于 C 端的缓冲协议,这样的数组将立即返回一个只读缓冲区,除非请求一个可写的缓冲区。如果请求可写的缓冲区将会发出警告。在使用 cython 时,应该在此类数组上使用const
修饰符以避免警告(例如cdef const double[::1] view
)。
未来的变化
在将来的版本中,dtype 中的 shape-1 字段将不会被压缩为标量。
目前,指定为 [(name, dtype, 1)]
或 "1type"
的字段被解释为标量字段(即与 [(name, dtype)]
或 [(name, dtype, ()]
相同)。现在将引发 FutureWarning;在将来的版本中,它将被解释为形状为 (1,) 的字段,即与 [(name, dtype, (1,))]
或 "(1,)type"
相同(与已经等效为 [(name, dtype, n)]
/ "ntype"
且 n>1
的情况一致,它已经等效为 [(name, dtype, (n,)]
/ "(n,)type"
)。
兼容性注意事项
float16
下溢舍入
从不同的浮点精度转换到 float16
在某些边缘情况下使用了不正确的四舍五入。这意味着在罕见情况下,下溢结果现在会四舍进一而不是舍去,改变了结果的最后一位(ULP)。
使用 divmod 时的有符号零
从版本 1.12.0 开始,当使用 divmod
和 floor_divide
函数得到结果为零时,numpy 返回一个负符号零。
>>> np.zeros(10)//1
array([-0., -0., -0., -0., -0., -0., -0., -0., -0., -0.])
由于此版本,结果现在正确地作为正符号零返回:
>>> np.zeros(10)//1
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
MaskedArray.mask
现在返回掩码的一个视图,而不是掩码本身。
返回掩码本身是不安全的,因为它可能被直接重塑,从而违反掩码数组代码的期望。现在 mask
的行为与 data
一致,也返回一个视图。
如果需要,可以仍然访问底层掩码 ._mask
。包含 assert x.mask is not y.mask
或类似内容的测试将需要更新。
不要在 numpy.frombuffer
中查找 __buffer__
属性。
查找 __buffer__
属性在 numpy.frombuffer
中是未记录且无效的。该代码已被移除。如果需要,使用 frombuffer(memoryview(obj), ...)
代替。
在 take
、choose
、put
中,out
在内存重叠时会被缓冲。
如果这些函数的输出参数提供并且与其他参数有内存重叠,则现在将对其进行缓冲以避免依赖顺序的行为。
加载时进行解托的拆包需要明确选择
函数 load
和 lib.format.read_array
现在包含一个 allow_pickle
关键字,默认为 False
,以应对 CVE-2019-6446。
旧随机模块中随机流的潜在更改
由于将log
应用于随机浮点数时存在错误,当从beta
, binomial
, laplace
, logistic
, logseries
或 multinomial
进行抽样时,如果在底层的MT19937
随机流中生成0
,则流可能会更改。这种情况发生的概率是
1
0
53
10^{53}
1053分之 1,因此对于任何给定的种子,流发生改变的概率极小。如果在底层生成器中遇到0
,那么现在会放弃生成的不正确值(要么是numpy.inf
,要么是numpy.nan
)。
i0
现在始终返回与输入相同形状的结果
以前,输出会被挤压,因此,例如,只有一个元素的输入将导致返回一个数组标量,并且具有形状如(10, 1)
的输入会产生无法广播到输入的结果。
请注意,我们通常建议使用 SciPy 实现而不是 numpy 实现:它是用 C 编写的适当ufunc
,速度比 numpy 快一个数量级以上。
can_cast
不再假设所有不安全的转换都被允许
先前,can_cast
对于casting='unsafe'
的几乎所有输入都返回True,即使在不可能转换的情况下,例如从结构化dtype
到常规dtype
。已修复此问题,使其与实际转换更一致,例如使用.astype
方法。
ndarray.flags.writeable
现在会更频繁地切换到 true。
在极少情况下,虽然基本数组是可写的,但是不可能将数组从不可写切换为可写。如果一个中间 ndarray.base
对象是可写的,可能会发生这种情况。先前,仅考虑了最深的基本对象来做出这个决定。但是,在极少情况下,这个对象没有必要的信息。在这种情况下,切换为可写是永远不允许的。现在已经修复了这个问题。
C API 变更
维度或步幅输入参数现在通过npy_intp const*
传递
先前,这些函数参数被声明为更严格的 npy_intp*
,这阻止了调用者传递常量数据。这个改变是向后兼容的,但是现在允许像下面这样的代码:
npy_intp const fixed_dims[] = {1, 2, 3};
// no longer complains that the const-qualifier is discarded
npy_intp size = PyArray_MultiplyList(fixed_dims, 3);
新特性
新的可扩展 numpy.random
模块,可选择随机数生成器
新的可扩展 numpy.random
模块与四个可选的随机数生成器以及用于并行进程的改进种子设定已经添加。目前可用的Bit Generators是MT19937、PCG64、Philox和SFC64。PCG64
是新的默认值,而MT19937
保留了向后兼容性。请注意,传统的 random 模块未更改,并且现在已被冻结,您当前的结果不会改变。更多信息,请参阅 API 变更描述和顶级视图
文档。
libFLAME
支持构建使用 libFLAME 线性代数包作为 LAPACK 实现的 NumPy,详情请见 libFLAME。
用户自定义的 BLAS 检测顺序
distutils
现在使用一个环境变量,不区分大小写和逗号分隔,来确定 BLAS 库的检测顺序。默认情况下为 NPY_BLAS_ORDER=mkl,blis,openblas,atlas,accelerate,blas
。然而,要强制使用 OpenBlas 只需执行:
NPY_BLAS_ORDER=openblas python setup.py build
强制使用 OpenBLAS。这对于安装了 MKL 但希望尝试不同实现的用户可能是有帮助的。
用户自定义 LAPACK 检测顺序
numpy.distutils
现在使用一个环境变量,不区分大小写和逗号分隔,来确定 LAPACK 库的检测顺序。默认情况下为 NPY_LAPACK_ORDER=mkl,openblas,flame,atlas,accelerate,lapack
。但是,要强制使用 OpenBLAS 只需执行:
NPY_LAPACK_ORDER=openblas python setup.py build
强制使用 OpenBLAS。这对于安装了 MKL 但希望尝试不同实现的用户可能是有帮助的。
ufunc.reduce
及相关函数现在接受 where
掩码
ufunc.reduce
,sum
,prod
,min
,max
现在都接受一个 where
关键字参数,这可以用于告诉缩减中应包含哪些元素。 对于没有单位元的缩减,还需要传入一个初始值(例如,对于 min
使用initial=np.inf
)。 例如,nansum
的等价物将是 np.sum(a, where=~np.isnan(a))
。
Timsort 和 radix sort 已代替 mergesort 进行稳定排序
radix sort 和 timsort 都已经被实现,并现在用来代替 mergesort。 由于需要保持向后兼容性,排序kind
选项 "stable"
和 "mergesort"
已被制作成对方的别名,实际排序实现取决于数组类型。 对于小于 16 位的小整数类型使用 radix sort,而剩下的类型使用 timsort。 Timsort 在包含已经或几乎排序好的数据时具有改善的性能,并且在随机数据上像 mergesort 一样执行,并且需要(O(n/2))的工作空间。 Timsort 算法的详细信息可以在 CPython listsort.txt 找到。
packbits
和unpackbits
接受order
关键字
order
关键字默认为big
,并且将相应地排序bits。 对于 'order=big'
,3 将变成[0, 0, 0, 0, 0, 0, 1, 1]
,对于order=little
为[1, 1, 0, 0, 0, 0, 0, 0]
unpackbits
现在接受count
参数
count
允许对将要预处理的比特数进行子集化,而不是稍后进行重塑和子集化,使得packbits
操作可逆,而拆包则不那么浪费。 大于可用比特数的计数添加零填充。 负计数则从末尾截取比特,而不是从开头计数。 无计数实现了拆包所有内容的现有行为。
linalg.svd
和linalg.pinv
在 hermitian 输入上可以更快
这些函数现在接受一个hermitian
参数,和 1.14.0 版本中添加到linalg.matrix_rank
的参数相匹配。
divmod 运算现在支持两个timedelta64
操作数
divmod 运算现在支持两个timedelta64
操作数,其类型签名为mm->qm
。
fromfile
现在接受一个offset
参数
这个函数现在接受一个用于二进制文件的offset
关键字参数,指定了从文件当前位置的偏移量(以字节为单位)。默认为0
。
pad
的新模式“empty”
此模式可使数组填充到所需形状,而不初始化新条目。
empty_like
和相关函数现在接受一个shape
参数
empty_like
、full_like
、ones_like
和zeros_like
现在接受一个shape
关键字参数,可用于创建一个新的数组作为原型,同时覆盖其形状。在与__array_function__
协议结合使用时非常有用,允许从类似 NumPy 的库创建新的任意形状数组,当这样的数组用作原型时。
浮点标量实现as_integer_ratio
以匹配内置的浮点数
这返回一个(分子,分母)对,可用于构造一个fractions.Fraction
。
结构化dtype
对象可以用多个字段名称进行索引
arr.dtype[['a', 'b']]
现在返回一个等价于arr[['a', 'b']].dtype
的 dtype,以保持与arr.dtype['a'] == arr['a'].dtype
的一致性。
与使用字段列表索引的结构化数组的 dtype 一样,这个 dtype 与原始的itemsize
相同,但只保留字段的子集。
这意味着arr[['a', 'b']]
和arr.view(arr.dtype[['a', 'b']])
是等价的。
.npy
文件支持 unicode 字段名称
引入了一个新的 3.0 格式版本,允许具有非拉丁 1 字段名称的结构化类型。需要时将自动使用此功能。
改进
数组比较断言包括最大差异
诸如testing.assert_allclose
的数组比较测试的错误消息现在包括“最大绝对差异”和“最大相对差异”,而不仅仅是以前的“不匹配”百分比。这些信息使更新绝对误差和相对误差容忍度更容易。
通过 pocketfft 库替换基于 fftpack 的fft
模块
两种实现都有相同的祖先(Paul N. Swarztrauber 的 Fortran77 FFTPACK),但是 pocketfft 包含额外的修改,这些修改改善了某些情况下的准确性和性能。对于包含大素数因子的 FFT 长度,pocketfft 使用 Bluestein 算法,该算法保持了(O(N log N))的运行时间复杂度,而不是素数长度变差为(O(N*N))。另外,对于接近素数长度的实值 FFT 的准确性得到改善,与复值 FFT 的准确性相当。
numpy.ctypeslib
中ctypes
支持的进一步改进
添加了一个新的numpy.ctypeslib.as_ctypes_type
函数,该函数可以将dtype
转换为最佳猜测的ctypes
类型。由于这个新函数,numpy.ctypeslib.as_ctypes
现在支持更广泛的数组类型,包括结构体、布尔值和非本机字节顺序的整数。
numpy.errstate
现在也是一个函数装饰器
目前,如果你有一个像这样的函数:
def foo():
pass
如果你想要将整个东西包装在errstate
中,你必须像这样重写它:
def foo():
with np.errstate(...):
pass
但是有了这个改变,你可以这样做:
@np.errstate(...)
def foo():
pass
从而节省一级缩进
numpy.exp
和numpy.log
的 float32 实现加速
exp
和log
的 float32 实现现在受益于 AVX2/AVX512 指令集,这些指令集在运行时被检测到。exp
的最大 ulp 误差为 2.52,log
的最大 ulp 误差为 3.83。
改进numpy.pad
的性能
大多数情况下,该函数的性能已经得到改善,通过使用预分配的数组填充所需的填充形状,而不是使用串联。
numpy.interp
更稳健地处理无穷大
在一些情况下,interp
以前会返回 nan
,现在会返回适当的无穷大。
fromfile
的 tofile
和 ndarray.dump 对 Pathlib 的支持
fromfile
、ndarray.ndarray.tofile 和 ndarray.dump
现在支持 pathlib.Path
类型用于 file
/fid
参数。
专门的 isnan
、isinf
和 isfinite
ufuncs 适用于 bool 和 int 类型
布尔和整数类型无法存储 nan
和 inf
值,这使我们能够提供比以前方法快 250 倍的专门的 ufuncs。
isfinite
支持 datetime64
和 timedelta64
类型
以前,当在这两种类型上使用isfinite
时,会引发 TypeError
nan_to_num
添加了新关键字
nan_to_num
现在接受关键字 nan
、posinf
和 neginf
,允许用户定义替换 nan
、正 np.inf
值和负 np.inf
值的值。
由于分配过大的数组可能导致内存错误,这些错误更具描述性
内存错误的原因经常是不正确的广播,导致非常庞大和错误的形状。错误消息现在包含此形状,以帮助诊断故障的原因。
floor
、ceil
和 trunc
现在尊重内置魔术方法
当在单元素数组上调用这些 ufunc 时,现在会调用__floor__
、__ceil__
和__trunc__
方法,使其与decimal.Decimal
和fractions.Fraction
对象兼容。
quantile
现在适用于Fraction.Fraction和decimal.Decimal
对象
总体而言,这种方法更优雅地处理对象数组,并且在使用精确算术类型时避免了浮点运算。
单元素数组在matmul
中的支持
现在可以使用matmul
(或@
运算符)与单元素数组一起使用。例如,现在可以这样做:
from fractions import Fraction
a = np.array([[Fraction(1, 2), Fraction(1, 3)], [Fraction(1, 3), Fraction(1, 2)]])
b = a @ a
变更
median
和percentile
系列函数不再警告nan
值
numpy.median
、numpy.percentile
和numpy.quantile
在遇到nan
时曾发出RuntimeWarning
。由于它们返回nan
值,警告是多余的,因此已经移除。
调整timedelta64 % 0
的行为以返回NaT
现在,两个np.timedelta64
操作数之间的模运算在除以零时返回NaT
,而不是返回零
NumPy 函数现在始终支持使用__array_function__
进行覆盖
NumPy 现在始终检查__array_function__
方法,以实现对非 NumPy 数组的 NumPy 函数覆盖,如NEP 18中所述。如果设置了适当的环境变量,此功能在 NumPy 1.16 中可以进行测试,但现在始终启用。
lib.recfunctions.structured_to_unstructured
不会压缩单字段视图
以前,structured_to_unstructured(arr[['a']])
会产生一个与structured_to_unstructured(arr[['a', b']])
不一致的压缩结果。这是偶然发生的。旧行为可以通过structured_to_unstructured(arr[['a']]).squeeze(axis=-1)
或更简单的arr['a']
来保留。
clip
现在在内部使用 ufunc
这意味着通过 descr->f->fastclip
在 C 中为自定义 dtypes 注册裁剪函数已过时 - 应改用 ufunc 注册机制,附加到 np.core.umath.clip
ufunc。
clip
还意味着接受 where
和 casting
参数,并且可以被 __array_ufunc__
覆盖。
这一变更的后果是,一些旧 clip
的行为已被弃用:
-
传递
nan
以表示“不裁剪”作为一个或两个边界。无论如何,这在所有情况下都���起作用,可以通过传递适当符号的无穷大来更好地处理。 -
当传递
out
参数时,默认使用“不安全”转换。明确使用casting="unsafe"
将使此警告消失。
此外,还存在一些行为改变的特例情况:
-
填充
max < min
已更改以使它在 dtypes 之间更一致,但不应依赖于此。 -
标量
min
和max
参与推广规则,就像其他所有 ufuncs 一样。
__array_interface__
偏移现在按文档中所述工作
接口可能会使用一个被错误地忽略的 offset
值。
savez
中的 pickle 协议设置为 3,用于 force zip64
标志
savez
未使用 force_zip64
标志,这将限制存档大小为 2GB。但是使用标志需要我们使用 pickle 协议 3 来写入 object
数组。使用的协议已调整为 3,意味着存档将无法被 Python2 读取。
使用不存在字段索引的结构化数组将引发 KeyError
而不是 ValueError
对结构类型使用 arr['bad_field']
会引发 KeyError
,以保持与 dict['bad_field']
的一致性。
亮点
-
添加了一个新的可扩展的
random
模块,以及四个可选择的随机数生成器和为并行进程设计的改进生成种子。当前可用的比特生成器有 MT19937, PCG64, Philox, 和 SFC64。请查看下面的新功能部分。 -
NumPy 的
FFT
实现已从 fftpack 更改为 pocketfft,导致转换速度更快,更准确,更好地处理素数长度的数据集。请参见下面的改进部分。 -
新的基数排序和 timsort 排序方法。目前无法选择使用哪种方法。它们是硬编码到数据类型中的,并且当
stable
或mergesort
作为方法传递时会使用。请查看下面的改进部分。 -
现在可以默认重写 numpy 函数,查看下面的
__array_function__
。
新函数
numpy.errstate
现在也是一个函数装饰器
弃用
numpy.polynomial
函数在用 int
代替 float
时会发出警告
之前该模块中的函数可以接受float
值,只要它们是整数(1.0
, 2.0
,等)。为了与 numpy 的其余部分保持一致,现在这样做已经被弃用,并且在将来会引发TypeError
。
类似地,现在在整数位置传递像0.5
这样的浮点数将引发TypeError
,而不是之前的ValueError
。
弃用numpy.distutils.exec_command
和 temp_file_name
这些函数的内部使用已被重构,有更好的替代方案。用subprocess.Popen
替换exec_command
,用tempfile.mkstemp
替换temp_file_name
C-API 包装数组的可写标志
当从 C-API 创建数组以包装数据指针时,我们唯一能够知道数据的读写性质的指标是在创建过程中设置的writeable
标志。强制该标志变为可写是很危险的。将来将不可能从 python 将标志切换为True
。这种弃用不应影响很多用户,因为以这种方式创建的数组在实践中非常少见,而且仅通过 NumPy C-API 可用。
不应该在 0 维数组上再调用numpy.nonzero
。
numpy.nonzero
对于 0 维数组的行为令人惊讶,几乎总是不正确的。如果打算保留旧的行为,可以通过使用nonzero(atleast_1d(arr))
代替nonzero(arr)
来保留它而不会发出警告。在将来的版本中,很可能会引发ValueError
。
写入numpy.broadcast_arrays
的结果会发出警告
通常情况下,numpy.broadcast_arrays
返回一个带有内部重叠的可写数组,对其进行写操作是不安全的。将来的版本将将 writeable
标志设置为 False
,并要求用户手动将其设置为 True
,如果他们确定这样做是他们想要的。现在对其进行写操作将发出弃用警告,并提供设置 writeable
标志为 True
的说明。请注意,如果在设置它之前检查标志,您会发现它已经是 True
。然而,在未来版本中,将明确设置它会清除一个用于产生弃用警告的内部标志。为帮助减轻混乱,当访问 writeable
标志状态时将发出额外的 FutureWarning,以澄清矛盾。
请注意,对于 C 端缓冲区协议,此类数组将立即返回只读缓冲区,除非请求可写缓冲区。如果请求可写缓冲区,将发出警告。在使用 Cython 时,应该对这种数组使用 const
修饰符以避免警告(例如 cdef const double[::1] view
)。
numpy.polynomial
中的函数在传递 float
时会发出警告,期望传递 int
以前,此模块中的函数会接受浮点值,只要它们是整数(1.0
, 2.0
等)。为了与 NumPy 的其余部分保持一致,现在已弃用此做法,并且在将来会引发 TypeError
。
类似地,在整数位置传递一个浮点数,现在将引发 TypeError
而不是以前的 ValueError
。
废弃 numpy.distutils.exec_command
和 temp_file_name
这些函数的内部使用已经重构,有更好的替代方案。用 subprocess.Popen
替换 exec_command
,用 tempfile.mkstemp
替换 temp_file_name
。
C-API 包装数组的可写标志
当从 C-API 创建数组以包装数据指针时,我们唯一知道数据可读写性的指示是在创建过程中设置的 writeable
标志。强制将标志设置为可写是危险的。将来将不再能够从 Python 将 writeable
标志切换为 True
。此弃用不会影响许多用户,因为以这种方式创建的数组在实践中非常罕见,并且仅通过 NumPy C-API 可用。
不应再在 0d 数组上调用 numpy.nonzero
在 0d 数组上使用 numpy.nonzero
的行为令人意外,使其几乎总是不正确的。 如果旧行为是有意的,则可以通过使用 nonzero(atleast_1d(arr))
而不是 nonzero(arr)
来保留它,而不会引发警告。 在将来的版本中,这很可能会引发 ValueError
。
对numpy.broadcast_arrays
的结果进行写操作将会有警告
通常情况下,numpy.broadcast_arrays
返回一个具有内部重叠的可写数组,使得对其进行写操作是不安全的。 未来版本将会将 writeable
标志设置为 False
,并要求用户手动将其设置为 True
,如果他们确信这是他们想要做的。现在对其进行写操作将会发出弃用警告,并提供设置 writeable
标志 True
的说明。 请注意,如果在设置标志之前检查标志,将会发现它已经是 True
。 显式设置它,如在将来的版本中将需要做的那样,会清除用于生成弃用警告的内部标志。 为了帮助减轻困惑,当访问 writeable
标志状态时将发出另一个 FutureWarning 以澄清矛盾。
请注意,对于 C 侧的缓冲协议,这样的数组将立即返回只读缓冲区,除非请求可写缓冲区。 如果请求可写缓冲区,将发出警告。在使用 Cython 时,应使用 const
修饰符来避免此类数组产生警告(例如 cdef const double[::1] view
)。
未来变更
将来版本中,dtype 中的形状为 1 的字段不会被合并为标量
目前,将字段指定为 [(name, dtype, 1)]
或 "1type"
将被解释为标量字段(即与 [(name, dtype)]
或 [(name, dtype, ()]
相同)。 现在会引发警告。 在将来的版本中,它将被解释为形状为(1,)的字段,即与 [(name, dtype, (1,))]
或 "(1,)type"
相同(与 [(name, dtype, n)]
/ "ntype"
,其中 n>1
已经等同于 [(name, dtype, (n,)]
/ "(n,)type"
))。
将来版本中,dtype 中的形状为 1 的字段��会被合并为标量
目前,将字段指定为 [(name, dtype, 1)]
或 "1type"
将被解释为标量字段(即与 [(name, dtype)]
或 [(name, dtype, ()]
相同)。 现在将发出 FutureWarning;在将来版本中,它将被解释为形状为(1,)的字段,即与 [(name, dtype, (1,))]
或 "(1,)type"
相同(与 [(name, dtype, n)]
/ "ntype"
,其中 n>1
已经等同于 [(name, dtype, (n,)]
/ "(n,)type"
))。
兼容性注意事项
float16
浮点数舍入
从不同的浮点精度转换为float16
在一些极端情况下使用不正确的舍入。这意味着在罕见情况下,次正规结果现在会向上舍入而不是向下舍入,改变了结果的最后一位(ULP)。
使用 divmod 时返回带符号的零
从1.12.0版本开始,当使用divmod
和floor_divide
函数得到结果为零时,numpy 在返回负号零时会出现错误。例如:
>>> np.zeros(10)//1
array([-0., -0., -0., -0., -0., -0., -0., -0., -0., -0.])
通过此版本发布,结果现在正确地返回为正号的零:
>>> np.zeros(10)//1
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
MaskedArray.mask
现在返回掩码的视图,而不是掩码本身
返回掩码本身是不安全的,因为它可能会被就地重塑,这会违反掩码数组代码的期望。mask
的行为现在与data
一致,也会返回一个视图。
如果需要访问底层掩码,可以用._mask
来获取。包含assert x.mask is not y.mask
或类似语句的测试将需要更新。
不要在numpy.frombuffer
中查找__buffer__
属性
在numpy.frombuffer
中查找__buffer__
属性是未记录和无效的。已删除此代码。如果需要,可以使用frombuffer(memoryview(obj), ...)
代替。
out
在内存重叠中被缓冲,适用于take
、choose
、put
如果这些函数的out
参数被提供并且与其他参数存在内存重叠,现在它将被缓冲以避免依赖于顺序的行为。
在加载时进行反序列化需要显式的选择
函数load
和lib.format.read_array
现在默认采用False
作为allow_pickle
关键字的响应,以应对CVE-2019-6446。
在旧的随机模块中随机流的潜在改变
由于在将log
应用于随机浮点数时存在 bug,如果在基础的MT19937
随机流中生成了0
,则取样时可能导致流更改。这种情况发生的概率是(10^{53})中有一个,因此任何给定种子导致流更改的概率极小。如果在基础生成器中遇到0
,那么现在会丢弃错误的值(要么是numpy.inf
,要么是numpy.nan
)。
i0
现在总是返回与输入相同形状的结果。
以前,输出被挤压,例如,只有一个元素的输入会导致返回一个数组标量,并且形状为(10, 1)
的输入将产生不能与输入广播的结果。
请注意,我们通常建议使用 SciPy 实现而不是 numpy 实现:它是用 C 编写的适当的 ufunc,并且比 numpy 实现快一个数量级以上。
can_cast
不再假设允许所有不安全的转换。
以前,can_cast
对于casting='unsafe'
几乎对所有输入返回True,即使在不可能转换的情况下,比如从结构化 dtype 到常规 dtype。这个问题已经修复,使其更符合实际转换的使用,例如 .astype
方法。
ndarray.flags.writeable
可以更频繁地切换为 true。
在罕见的情况下,将数组从不可写入切换为可写入可能是不可能的,尽管基本数组是可写入的。如果一个中间ndarray.base
对象是可写入的,这种情况就会发生。以前,只有最深的基对象被考虑用于这个决定。然而,在罕见的情况下,这个对象没有必要的信息。在这种情况下,从不允许切换到可写入。这个问题现在已经修复。
float16
次正规舍入
从不同的浮点精度转换为float16
在某些边缘情况下使用了不正确的舍入。这意味着在罕见的情况下,次正规结果现在将向上舍入,而不是向下舍入,改变了结果的最后一位(ULP)。
使用 divmod 时的有符号零
从1.12.0
版本开始,当使用divmod
和floor_divide
函数时,numpy 在结果为零时错误地返回了一个带负号的零。例如:
>>> np.zeros(10)//1
array([-0., -0., -0., -0., -0., -0., -0., -0., -0., -0.])
有了这个版本,结果现在正确地被返回为一个明显的有符号零:
>>> np.zeros(10)//1
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
MaskedArray.mask
现在返回掩码的视图,而不是掩码本身
返回掩码本身是不安全的,因为它可能被就地重塑,这将违反掩码数组代码的预期。mask
的行为现在与data
一致,后者也返回一个视图。
如果需要,仍然可以通过._mask
访问底层掩码。包含assert x.mask is not y.mask
或类似语句的测试将需要更新。
不要在numpy.frombuffer
中查找__buffer__
属性
在numpy.frombuffer
中查找__buffer__
属性是未记录且无效的。这段代码已被删除。如果需要,可以使用frombuffer(memoryview(obj), ...)
代替。
在take
、choose
和put
中,用于处理内存重叠的out
现在是缓冲的
如果这些函数的out
参数已经提供并且与其他参数有内存重叠,现在将对其进行缓冲以避免依赖于顺序的行为。
在加载时解封装需要明确选择
函数load
和lib.format.read_array
现在默认带有一个allow_pickle
关键字,以响应CVE-2019-6446。
旧随机模块中对随机流的潜在变更
由于将log
应用于随机浮点数的错误,当从 beta
、binomial
、laplace
、logistic
、logseries
或 multinomial
中的任一生成随机数流时生成了0
时,流可能会发生变化。发生这种情况的概率是 (10^{53}) 中的 1
,因此对于任何给定的种子,流变化的概率都极小。如果在底层生成器中遇到0
,那么现在将删除生成的错误值(numpy.inf
或 numpy.nan
)。
i0
现在总是返回与输入相同形状的结果。
以前,输出会被挤压,例如,只有一个元素的输入会导致返回一个数组标量,并且形状为 (10, 1)
的输入将产生不能对输入进行广播的结果。
请注意,我们通常建议使用 SciPy 的实现而不是 numpy 的实现:它是用 C 编写的合适的 ufunc,速度比 numpy 快一个数量级以上。
can_cast
不再假设所有不安全的转换都是允许的。
以前,can_cast
对于casting='unsafe'
几乎对所有输入都返回True,即使对于不能进行转换的情况(例如,从结构化的 dtype 到常规的 dtype)。已经修复了这个问题,使其更符合实际的转换,例如使用 .astype
方法。
ndarray.flags.writeable
稍微更频繁地可以切换为 true。
在罕见的情况下,可能无法将数组从不可写切换为可写,尽管基础数组是可写的。如果中间的 ndarray.base
对象是可写的,就会发生这种情况。以前,只有最深的基本对象被考虑在内做出这个决定。但是,在罕见的情况下,这个对象没有必要的信息。在这种情况下,切换为可写是永远不被允许的。现在这个问题已经解决了。
C API 变更
维度或步幅输入参数现在由 npy_intp const*
传递
以前这些函数参数被声明为更严格的 npy_intp*
,这阻止了调用者传递常量数据。这个更改向后兼容,但现在允许如下代码:
npy_intp const fixed_dims[] = {1, 2, 3};
// no longer complains that the const-qualifier is discarded
npy_intp size = PyArray_MultiplyList(fixed_dims, 3);
维度或步幅输入参数现在由 npy_intp const*
传递
以前这些函数参数被声明为更严格的 npy_intp*
,这阻止了调用者传递常量数据。这个更改向后兼容,但现在允许如下代码:
npy_intp const fixed_dims[] = {1, 2, 3};
// no longer complains that the const-qualifier is discarded
npy_intp size = PyArray_MultiplyList(fixed_dims, 3);
新特性
具有可选随机数生成器的新的可扩展的 numpy.random
模块
新的可扩展的 numpy.random
模块与四种可选的随机数生成器和改进的种子设计用于并行进程中的使用已经添加。当前可用的 Bit Generators 有 MT19937, PCG64, Philox, 和 SFC64。PCG64
是新的默认值,而 MT19937
被保留以保持向后兼容性。请注意,旧版随机模块保持不变,并且现在被冻结,您当前的结果不会改变。更多信息请参见 API 变更说明和顶层视图
文档。
libFLAME
支持使用 libFLAME 线性代数包作为 LAPACK 实现来构建 NumPy,详情请参见 libFLAME。
用户定义的 BLAS 检测顺序
distutils
现在使用环境变量来确定 BLAS 库的检测顺序,环境变量是大小写不敏感的,采用逗号分隔。默认情况下 NPY_BLAS_ORDER=mkl,blis,openblas,atlas,accelerate,blas
。然而,要强制使用 OpenBLAS 只需执行:
NPY_BLAS_ORDER=openblas python setup.py build
强制使用 OpenBLAS。这对于那些已经安装了 MKL 但希望尝试不同实现的用户可能有帮助。
用户定义的 LAPACK 检测顺序
numpy.distutils
现在使用环境变量来确定 LAPACK 库检测顺序,环境变量是大小写不敏感的,采用逗号分隔。默认情况下 NPY_LAPACK_ORDER=mkl,openblas,flame,atlas,accelerate,lapack
。然而,要强制使用 OpenBLAS 只需执行:
NPY_LAPACK_ORDER=openblas python setup.py build
它会强制使用 OpenBLAS。这对于具有 MKL 安装但希望尝试不同实现的用户可能有所帮助。
ufunc.reduce
和相关函数现在接受where
掩码
ufunc.reduce
,sum
,prod
,min
,max
现在都接受一个where
关键字参数,该参数用于指定哪些元素包含在缩减中。对于没有单位元的缩减,还必须传入一个初始值(例如,对于min
,initial=np.inf
)。例如,nansum
的等效方式将是np.sum(a, where=~np.isnan(a))
。
timsort
和radix sort
已经取代了mergesort
进行稳定排序
radix sort
和timsort
已经被实现并且现在用于取代mergesort
。由于需要保持向后兼容性,排序kind
选项"stable"
和"mergesort"
已经被设置为彼此的别名,实际的排序实现取决于数组类型。对于 16 位或更小的小整数类型使用radix sort
,对于其余类型使用timsort
。timsort
在包含已经或几乎已经排序数据的数据上具有改进的性能,并且在随机数据上表现像mergesort
,需要(O(n/2))的工作空间。timsort
算法的细节可以在CPython listsort.txt找到。
packbits
和unpackbits
接受order
关键字
order
关键字默认为big
,并根据需要重新排序bits。对于'order=big'
,3 将变为[0, 0, 0, 0, 0, 0, 1, 1]
,对于order=little
,将变为[1, 1, 0, 0, 0, 0, 0, 0]
unpackbits
现在接受一个count
参数
count
允许对将要解压的位数进行子集化,而不是后续重塑和子集化,使packbits
操作可逆,并且解压变得不那么浪费。大于可用位数的计数添加零填充。负数的计数将从尾部修剪位,而不是从开头数。None
计数实现了解压所有内容的现有行为。
linalg.svd
和 linalg.pinv
在共轭输入上可能更快
这些函数现在接受一个hermitian
参数,与 1.14.0 中添加到 linalg.matrix_rank
中的参数匹配。
divmod 操作现在支持两个 timedelta64
操作数
divmod 运算现在可以处理两个 timedelta64
操作数,具有类型签名 mm->qm
。
fromfile
现在接受一个 offset
参数
这个函数现在为二进制文件接受一个 offset
关键字参数,指定从文件当前位置的偏移量(以字节为单位)。默认为0
。
pad
的新模式“empty”
这种模式可以将数组填充到所需的形状而不初始化新条目。
empty_like
和相关函数现在接受一个 shape
参数
empty_like
, full_like
, ones_like
和 zeros_like
现在接受一个 shape
关键字参数,该参数可用于创建一个新的数组作为原型,同时覆盖其形状。当与__array_function__
协议一起使用时,特别有用,允许从类似 NumPy 的库中使用这样的数组作为原型创建新的任意形状数组。
浮点数标量实现了as_integer_ratio
以匹配内置浮点数
这返回一个(分子,分母)对,可用于构造一个fractions.Fraction
。
结构化的dtype
对象可以用多个字段名称进行索引
arr.dtype[['a', 'b']]
现在返回一个等效于arr[['a', 'b']].dtype
的 dtype,以保持一致性,就像arr.dtype['a'] == arr['a'].dtype
一样。
就像对一组字段进行索引的结构化数组的 dtype 一样,这个 dtype 的itemsize
与原始的相同,但仅保留字段的子集。
这意味着 arr[['a', 'b']]
和 arr.view(arr.dtype[['a', 'b']])
是等效的。
.npy
文件支持 Unicode 字段名
引入了一个新的格式版本 3.0,允许具有非 Latin1 字段名称的结构化类型。在需要时会自动使用。
具有可选择随机数生成器的新可扩展 numpy.random
模块
新的可扩展 numpy.random
模块和四个可选的随机数生成器以及为并行进程设计的改进种子设置已添加。目前可用的 Bit Generators 包括 MT19937、PCG64、Philox 和 SFC64。PCG64
是新的默认值,而 MT19937
保留作为向后兼容。请注意,传统的 random 模块保持不变且已冻结,所以您的当前结果不会改变。更多信息请参阅 API 更改描述 和 顶层视图
文档。
libFLAME
使用 libFLAME 线性代数包作为 LAPACK 实现构建 NumPy 的支持,请参阅 libFLAME 了解详情。
用户定义的 BLAS 检测顺序
distutils
现在使用一个环境变量,大小写不敏感,逗号分隔,来确定 BLAS 库的检测顺序。默认情况下为 NPY_BLAS_ORDER=mkl,blis,openblas,atlas,accelerate,blas
。如果要强制使用 OpenBLAS,只需执行:
NPY_BLAS_ORDER=openblas python setup.py build
这会强制使用 OpenBLAS。对于已安装 MKL 但希望尝试不同实现的用户,这可能会有所帮助。
用户定义的 LAPACK 检测顺序
numpy.distutils
现在使用一个环境变量,大小写不敏感,逗号分隔,来确定 LAPACK 库的检测顺序。默认情况下为 NPY_LAPACK_ORDER=mkl,openblas,flame,atlas,accelerate,lapack
。如果要强制使用 OpenBLAS,只需执行:
NPY_LAPACK_ORDER=openblas python setup.py build
这会强制使用 OpenBLAS。对于已安装 MKL 但希望尝试不同实现的用户,这可能会有所帮助。
ufunc.reduce
和相关函数现在接受一个 where
掩码
ufunc.reduce
、sum
、prod
、min
、max
现在都接受一个 where
关键字参数,该参数可用于指定在规约中包含哪些元素。对于没有标识的规约,还需要传递一个初始值(例如对于 min
,使用 initial=np.inf
)。例如,nansum
的等效形式是 np.sum(a, where=~np.isnan(a))
。
Timsort 和基数排序已替代归并排序用于稳定排序。
基数排序和 timsort 都已实施并现在用于取代合并排序。 由于需要保持向后兼容性,排序 kind
选项 "stable"
和 "mergesort"
已成为彼此的别名,实际的排序实现取决于数组类型。 基数排序用于 16 位或更小的小整数类型,剩下的类型使用 timsort。 Timsort 在包含已排序或几乎已排序数据的数据上具有更好的性能,并在随机数据上类似于合并排序,需要 (O(n/2)) 的工作空间。 关于 timsort 算法的详细信息可以在 CPython listsort.txt 找到。
packbits
和 unpackbits
接受一个 order
关键字。
order
关键字默认为 big
,并相应地排列位。 对于 'order=big'
,3 将变为 [0, 0, 0, 0, 0, 0, 1, 1]
,对于 order=little
,将变为 [1, 1, 0, 0, 0, 0, 0, 0]
。
unpackbits
现在接受一个 count
参数。
count
允许对将要预解压的比特数进行分组,而不是稍后进行重塑和分组,使得 packbits
操作可逆,并且减少了解压时的浪费。 大于可用比特数的计数会添加零填充。 负计数将从末尾修剪比特,而不是从开头计数。 无计数实现解压所有内容的现有行为。
linalg.svd
和 linalg.pinv
在厄米输入上可能更快。
这些函数现在接受一个 hermitian
参数,与 1.14.0 版本中添加到 linalg.matrix_rank
中的参数对应。
divmod 运算现在支持两个 timedelta64
操作数。
divmod 运算符现在可以处理两个 timedelta64
操作数,其类型签名为 mm->qm
。
fromfile
现在接受一个 offset
参数。
这个函数现在接受一个关键字参数 offset
用于二进制文件,该参数指定了相对于文件当前位置的偏移量(以字节为单位)。默认为 0
。
pad
的新模式“empty”。
该模式将数组填充到所需形状,而不初始化新条目。
empty_like
和相关函数现在接受一个 shape
参数。
empty_like
、full_like
、ones_like
和zeros_like
现在接受一个shape
关键字参数,该参数可用于创建一个新的数组作为原型,同时覆盖其形状。当与__array_function__
协议结合使用时,这特别有用,允许从类似 NumPy 的库创建新的任意形状数组,当这样的数组用作原型时。
浮点标量实现as_integer_ratio
以匹配内置的浮点数
这返回一个(分子,分母)对,可用于构造一个fractions.Fraction
。
结构化的dtype
对象可以用多个字段名称索引
arr.dtype[['a', 'b']]
现在返回一个等同于arr[['a', 'b']].dtype
的 dtype,以保持与arr.dtype['a'] == arr['a'].dtype
的一致性。
像使用字段列表索引的结构化数组的dtype
一样,此dtype
与原始的具有相同的itemsize
,但只保留字段的子集。
这意味着arr[['a', 'b']]
和arr.view(arr.dtype[['a', 'b']])
是等价的。
.npy
文件支持 unicode 字段名
引入了 3.0 的新格式版本,该版本使非拉丁 1 字段名称的结构化类型可用。需要时会自动使用此版本。
改进
数组比较断言包括最大差异
数组比较测试的错误消息,如testing.assert_allclose
,现在包括“最大绝对差异”和“最大相对差异”,除了以前的“不匹配”百分比。这些信息使更新绝对和相对误差容差更加容易。
用 pocketfft 库替换基于 fftpack 的fft
模块
两个实现具有相同的祖先(Paul N. Swarztrauber 的 Fortran77 FFTPACK),但 pocketfft 包含了额外的修改,提高了某些情况下的精度和性能。对于包含大素数因子的 FFT 长度,pocketfft 使用 Bluestein 算法,保持(O(N log N))的运行时间复杂度,而不是对于素数长度而言恶化为(O(N*N))。此外,对于近似素数长度的实值 FFT,精度已经提高,并与复值 FFT 相媲美。
在numpy.ctypeslib
中进一步改进了对ctypes
的支持
新添加了一个 numpy.ctypeslib.as_ctypes_type
函数,可以将一个 dtype
转换为最佳猜测的 ctypes
类型。由于这个新函数,numpy.ctypeslib.as_ctypes
现在支持更广泛的数组类型,包括结构、布尔和非本机字节顺序的整数。
numpy.errstate
现在也是一个函数装饰器
目前,如果你有一个如下的函数:
def foo():
pass
并且你想要将整个事情包装在 errstate
中,你必须像这样重新编写它:
def foo():
with np.errstate(...):
pass
但是有了这个更改,你可以这样做:
@np.errstate(...)
def foo():
pass
从而节省一个缩进级别
numpy.exp
和 numpy.log
的 float32 实现加速
exp
和 log
的 float32 实现现在受益于在运行时检测到的 AVX2/AVX512 指令集。exp
的最大 ulp 误差为 2.52,而 log
的最大 ulp 误差为 3.83。
改进 numpy.pad
的性能
该函数的性能已经得到了改进,通过用期望的填充形状来填充预分配的数组,而不是使用连接。
numpy.interp
更加健壮地处理了无穷大
在一些以前 interp
会返回 nan
的情况下,它现在返回适当的无限大。
fromfile
、tofile 和 ndarray.dump
的 Pathlib 支持
fromfile
、ndarray.ndarray.tofile 和 ndarray.dump
现在支持 pathlib.Path
类型作为 file
/fid
参数。
布尔和整数类型的专门isnan
,isinf
和isfinite
ufuncs
布尔和整数类型无法存储nan
和inf
值,这使我们能够提供比以前方法快 250 倍的专门的 ufuncs。
isfinite
支持datetime64
和timedelta64
类型
以前,isfinite
在这两种类型上使用时会引发TypeError。
新关键字添加到nan_to_num
nan_to_num
现在接受关键字nan
,posinf
和 neginf
,允许用户定义替换nan
,正np.inf
和负np.inf
值的值。
由于分配过大的数组引起的 MemoryErrors 更具描述性
MemoryError 的原因经常是不正确的广播,导致非常大且错误的形状。现在错误的消息中包括这个形状,以帮助诊断失败的原因。
floor
,ceil
和 trunc
现在尊重内置的魔术方法
这些 ufuncs 现在在调用对象数组时调用__floor__
,__ceil__
和__trunc__
方法,使它们与decimal.Decimal
和fractions.Fraction
对象兼容。
quantile
现在适用于fraction.Fraction和decimal.Decimal
对象
一般来说,这更优雅地处理对象数组,并且如果使用精确算术类型,则避免了浮点数操作。
在matmul
中支持对象数组
现在可以使用matmul
(或@
运算符)与对象数组。例如,现在可以执行:
from fractions import Fraction
a = np.array([[Fraction(1, 2), Fraction(1, 3)], [Fraction(1, 3), Fraction(1, 2)]])
b = a @ a
数组比较断言包括最大差异
数组比较测试的错误消息,例如testing.assert_allclose
,现在包括“最大绝对差”和“最大相对差”,除了以前的“不匹配”百分比。这些信息使得更容易更新绝对和相对误差容限。
通过 pocketfft 库替换基于 fftpack 的fft
模块
两个实现都有相同的祖先(Paul N. Swarztrauber 的 Fortran77 FFTPACK),但是 pocketfft 包含了额外的修改,改进了某些情况下的精度和性能。对于包含大素数因子的 FFT 长度,pocketfft 使用 Bluestein 算法,保持(O(N log N))的运行时间复杂度,而不是对于素数长度向(O(N*N))的恶化。此外,对于接近素数长度的实值 FFT 的精度已经得到改进,并且和复值 FFT 的精度相媲美。
对numpy.ctypeslib
的ctypes
支持进一步改善
新添加了一个numpy.ctypeslib.as_ctypes_type
函数,它可以将dtype
转换成最佳猜测的ctypes
类型。由于这个新函数,numpy.ctypeslib.as_ctypes
现在支持更广泛的数组类型,包括结构、布尔类型和非本机字节顺序的整数。
numpy.errstate
现在也是一个函数修饰器
目前,如果你有一个像这样的函数:
def foo():
pass
如果你想要用errstate
包装整个东西,你必须像这样重新写:
def foo():
with np.errstate(...):
pass
但是有了这个改变,你可以这样做:
@np.errstate(...)
def foo():
pass
从而节省一级缩进
numpy.exp
和numpy.log
在 float32 实现上加速了
exp
的 float32 实现现在受益于在运行时检测到的 AVX2/AVX512 指令集。exp
的最大 ulp 误差为 2.52,而log
的最大 ulp 误差为 3.83。
改进了numpy.pad
的性能
大多数情况下,通过将预先分配的数组填充到所需的填充形状中,而不是使用连接操作,提高了函数的性能。
numpy.interp
更加稳健地处理无穷大值
在以前返回 nan
的某些情况下,现在返回适当的无穷大值。
fromfile
、tofile 和 ndarray.dump
支持 Pathlib
fromfile
、ndarray.ndarray.tofile 和 ndarray.dump
现在支持 pathlib.Path
类型用于 file
/fid
参数。
专门的 bool 型和 int 型 isnan、isinf 和 isfinite 通用函数
布尔型和整型无法存储 nan
和 inf
值,这使得我们能够提供比先前方法快 250 倍的专门的通用函数。
isfinite 支持 datetime64
和 timedelta64
类型
以前,对这两种类型使用 isfinite
会引发 TypeError。
新增到nan_to_num
中的关键字
nan_to_num
现在接受 nan
、posinf
和 neginf
作为关键字,允许用户定义替代 nan
,正无穷和负无穷 np.inf
值的值。
由于分配过大的数组导致的内存错误更加详细描述
MemoryError 的原因通常是不正确的广播,导致形状非常大且不正确。错误信息现在包括此形状,以帮助诊断故障原因。
floor
、ceil
和 trunc
现在尊重内置的魔法方法
当在对象数组上调用这些 ufuncs 时,现在会调用 __floor__
、__ceil__
和 __trunc__
方法,使其与 decimal.Decimal
和 fractions.Fraction
对象兼容。
quantile
现在适用于 fraction.Fraction 和 decimal.Decimal
对象
一般来说,这更优雅地处理对象数组,并且在使用精确算术类型时避免浮点运算。
在 matmul
中支持对象数组
现在可以使用 matmul
(或 @
操作符)与对象数组。 例如,现在可以执行以下操作:
from fractions import Fraction
a = np.array([[Fraction(1, 2), Fraction(1, 3)], [Fraction(1, 3), Fraction(1, 2)]])
b = a @ a
变化
median
和 percentile
函数族不再警告 nan
numpy.median
、numpy.percentile
和 numpy.quantile
在遇到 nan
时曾经发出 RuntimeWarning
。 由于它们返回 nan
值,警告是多余的,已经移除。
timedelta64 % 0
的行为已调整为返回 NaT
两个 np.timedelta64
操作数的模运算现在在除以零的情况下返回 NaT
,而不是返回零
现在 NumPy 函数始终支持使用 __array_function__
进行覆盖
现在 NumPy 始终检查 __array_function__
方法以在非 NumPy 数组上实现 NumPy 函数的覆盖,如 NEP 18 中所述。 如果设置了适当的环境变量,该功能在 NumPy 1.16 中可用于测试,但现在始终启用。
lib.recfunctions.structured_to_unstructured
不会压缩单字段视图
以前 structured_to_unstructured(arr[['a']])
会产生与 structured_to_unstructured(arr[['a', b']])
不一致的压缩结果。 这是意外的。 旧行为可以通过 structured_to_unstructured(arr[['a']]).squeeze(axis=-1)
或更简单地 arr['a']
保留。
clip
现在在内部使用 ufunc
这意味着使用 C 通过descr->f->fastclip
为自定义 dtypes 注册剪切函数已被弃用 - 它们应该使用 ufunc 注册机制,附加到np.core.umath.clip
ufunc 上。
这也意味着clip
接受where
和casting
参数,并且可以被__array_ufunc__
覆盖。
此更改的结果是一些旧clip
的行为已被弃用:
-
将
nan
传递为“不要截取”作为一个或两个边界。无论如何,这在所有情况下都不起作用,并且可以通过传递适当符号的无穷大来更好地处理。 -
当传递
out
参数时,默认使用“不安全”的强制转换。显式使用casting="unsafe"
将消除此警告。
此外,还存在一些行为更改的边界情况:
-
对
max < min
进行填充已更改为在 dtypes 之间更一致,但不应依赖此行为。 -
标量
min
和max
像其他所有 ufunc 一样参与推广规则。
__array_interface__
偏移现在按照文档运行。
接口可能使用一个错误被忽略的offset
值。
savez
中的 pickle 协议设定为 3,用于force zip64
标志。
savez
在不使用force_zip64
标志时,将存档大小限制为 2GB。但使用该标志需要我们使用 pickle 协议 3 来写入object
数组。使用的协议已升级为 3,这意味着 Python2 无法读取存档。
对不存在字段进行索引的结构化数组引发KeyError
而不是ValueError
。
对结构化类型的arr['bad_field']
引发KeyError
,以保持与dict['bad_field']
的一致性。
median
和percentile
函数族不再警告关于nan
。
numpy.median
,numpy.percentile
,和numpy.quantile
在遇到nan
时曾经发出RuntimeWarning
。由于它们返回nan
值,警告是多余的,因此已被移除。
timedelta64 % 0
行为已调整为返回NaT
。
两个np.timedelta64
操作数进行模运算现在在除以零时返回NaT
,而不是返回零。
NumPy 函数现在始终支持使用__array_function__
进行覆盖。
NumPy 现在始终检查 __array_function__
方法以实现对非 NumPy 数组的 NumPy 函数的覆盖,如 NEP 18 所述。如果设置了适当的环境变量,则该功能在 NumPy 1.16 中可用于测试,但现在已经始终启用。
lib.recfunctions.structured_to_unstructured
不会压缩单字段视图。
以前 structured_to_unstructured(arr[['a']])
会产生一个与 structured_to_unstructured(arr[['a', b']])
不一致的压缩结果。这是意外的。可以使用 structured_to_unstructured(arr[['a']]).squeeze(axis=-1)
或者更简单地使用 arr['a']
来保留旧行为。
clip
现在在底层使用一个 ufunc。
这意味着通过 descr->f->fastclip
在 C 中为自定义 dtypes 注册剪辑函数已过时 - 它们应该使用 ufunc 注册机制,附加到 np.core.umath.clip
ufunc 上。
这也意味着 clip
接受 where
和 casting
参数,并且可以用 __array_ufunc__
覆盖。
这个变化的一个后果是,一些旧 clip
的行为已经过时:
-
将
nan
传递给表示“不剪裁”的一个或两个边界。在任何情况下都无法正常工作,可以通过传递适当符号的无穷大来更好地处理。 -
当传递
out
参数时,默认使用“unsafe”强制转换。明确使用casting="unsafe"
将消除此警告。
此外,还有一些行为变化的边缘案例:
-
填充
max < min
的行为已更改以在 dtypes 之间更一致,但不应依赖于此。 -
标量
min
和max
参与促进规则,就像它们在所有其他 ufuncs 中一样。
__array_interface__
偏移现在按照文档正常工作。
接口可能使用了一个被错误忽略的 offset
值。
在 savez
中的 pickle 协议设置为 3 以使用 force zip64
标志。
savez
没有使用 force_zip64
标志,这将限制存档的大小为 2GB。但是使用该标志要求我们使用 pickle 协议 3 来写入 object
数组。所使用的协议已升级到 3,这意味着存档将无法被 Python2 读取。
使用不存在字段索引的结构化数组会引发 KeyError
而不是 ValueError
。
在结构化类型上使用 arr['bad_field']
会引发 KeyError
,以保持与 dict['bad_field']
的一致性。
NumPy 1.16.6 发布说明
NumPy 1.16.6 版本修复了针对 1.16.5 版本报告的错误,并且还从主版中回退了一些增强功能,这些增强功能似乎适用于最后支持 Python 2.7 的版本系列。PyPI 上的 Wheels 已经与 OpenBLAS v0.3.7 链接在一起,这应该修复了 Skylake 系列 CPU 上的错误。
构建此版本的下游开发人员应使用 Cython >= 0.29.2,并且如果使用 OpenBLAS,则使用 OpenBLAS >= v0.3.7。支持的 Python 版本为 2.7 和 3.5-3.7。
亮点
np.testing.utils
函数已从 1.19.0-dev0 进行了更新。这将改善函数文档和错误消息,并将assert_array_compare
函数扩展到其他类型。
新函数
允许 @ 运算符用于对象数组的矩阵乘法。
这是 NumPy 1.17 中添加的一个增强功能,看起来很合理, 可以包括在 LTS 1.16 版本系列中。
兼容性说明
修复布尔类型的矩阵乘法(*@*运算符)中的回归错误
布尔值被视为整数而不是布尔值,这是与以前行为相比的一个回归。
改进
数组比较断言包括最大差异
数组比较测试的错误消息,如 testing.assert_allclose
,现在包括“最大绝对差异”和“最大相对差异”,除了之前的“不匹配”百分比。这些信息让更新绝对误差和相对误差容差更容易。
贡献者
共有 10 人为此次发布做出了贡献。
-
蛋糕配牛排
-
查尔斯·哈里斯
-
克里斯·伯尔
-
埃里克·维塞尔
-
费尔南多·萨拉维亚
-
拉斯·格鲁特
-
马蒂·皮库斯
-
马克斯韦尔·阿拉达
-
曾其明
-
沃伦·韦克塞
合并的拉取请求
总共有 14 个拉取请求合并到了此发布版。
-
#14211:BUG:修复使用 linear_ramp 和负值时的 uint 溢出…
-
#14275:BUG:修复允许从 PY2 中解除 PY3_pickle
-
#14340:BUG:修复在各个地方的 .names 和 .fields 的误用(回退…
-
#14423:BUG:测试,修复了转换为 ctypes 的回归错误。
-
#14434:BUG:修复 assert_allclose 中最大相对误差的报告
-
#14509:BUG:修复了布尔矩阵乘法的回归。
-
#14686:BUG:正确定义 PyArray_DescrCheck
-
#14853:BLD:将“apt update”添加到 shippable 中
-
#14854:BUG:修复 _ctypes 类的循环引用。(#13808)
-
#14856:BUG:修复 Power9 Linux 和 z/Linux 上的np.einsum错误
-
#14863: BLD: 防止 -flto 优化长双精度表示…
-
#14864: BUG: lib: 修复带有有符号整数数组的直方图问题。
-
#15172: ENH: 将测试函数的改进回溯。
-
#15191: REL: 准备 1.16.6 版本发布。
亮点
np.testing.utils
函数已从 1.19.0-dev0 更新。这改进了函数文档和错误消息,同时将assert_array_compare
函数扩展到其他类型。
新函数
允许 matmul (@ 运算符) 与对象数组一起使用。
这是在 NumPy 1.17 中添加的增强功能,似乎合理地包含在 LTS 1.16 发布系列中。
允许 matmul (@ 运算符) 与对象数组一起使用。
这是在 NumPy 1.17 中添加的增强功能,似乎合理地包含在 LTS 1.16 发布系列中。
兼容性注意事项
修复 matmul (@ 运算符) 在布尔类型中的回归
布尔值被视为整数而不是布尔值,这是与以前行为不符的回归。
修复 matmul (@ 运算符) 在布尔类型中的回归
布尔值被视为整数而不是布尔值,这是与以前行为不符的回归。
改进
数组比较断言包括最大差异
数组比较测试的错误消息(如 testing.assert_allclose
)现在包括“最大绝对差异”和“最大相对差异”,除了之前的“不匹配”百分比。此信息使得更新绝对和相对误差容差更加容易。
数组比较断言包括最大差异
数组比较测试的错误消息(如 testing.assert_allclose
)现在包括“最大绝对差异”和“最大相对差异”,除了之前的“不匹配”百分比。此信息使得更新绝对和相对误差容差更加容易。
贡献者
本次发布共有 10 位贡献者。
-
CakeWithSteak
-
Charles Harris
-
Chris Burr
-
Eric Wieser
-
Fernando Saravia
-
Lars Grueter
-
Matti Picus
-
Maxwell Aladago
-
Qiming Sun
-
Warren Weckesser
合并的拉取请求
本次发布合并了总共 14 个拉取请求。
-
#14211: BUG: 修复使用 linear_ramp 和负值填充时的无符号整数溢出…
-
#14275: BUG: 修复允许从 PY2 反序列化 PY3 pickle
-
#14340: BUG: 修复在各个地方误用 .names 和 .fields (回溯…
-
#14423: BUG: 测试,在转换为 ctypes 中修复回归。
-
#14434: BUG: 修复 assert_allclose 中最大相对误差报告问题
-
#14509: BUG: 修复布尔 matmul 中的回归。
-
#14686: BUG:正确定义 PyArray_DescrCheck
-
#14853: BLD:在 shippable 中添加‘apt update’。
-
#14854: BUG:修复 _ctypes 类的循环引用。(#13808)
-
#14856: BUG:修复在 Power9 Linux 和 z/Linux 上的np.einsum错误。
-
#14863: BLD:防止-flto 优化长双精度表示……
-
#14864: BUG:lib:修复带有有符号整数数组的直方图问题。
-
#15172: ENH:将测试函数的改进回溯。
-
#15191: REL:为 1.16.6 版本做准备。
NumPy 1.16.5 版本说明
NumPy 1.16.5 版本修复了对 1.16.4 版本报告的错误,并从主分支中回溯了几个增强功能,这些增强功能似乎适合于最后支持 Python 2.7 的版本系列。在 PyPI 上的安装程序链接到了 OpenBLAS v0.3.7-dev,这应该修复 Skylake 系列 cpu 上的错误。
构建此版本的下游开发人员应使用 Cython >= 0.29.2,并且如果使用 OpenBLAS,则使用 OpenBLAS >= v0.3.7。支持的 Python 版本为 2.7 和 3.5-3.7。
贡献者
总共有 18 人为这个版本做出了贡献。名字后面带“+”的人第一次贡献了补丁。
-
亚历山大·沙钦
-
艾伦·哈尔丹
-
布鲁斯·梅里 +
-
查尔斯·哈里斯
-
科林·斯奈德 +
-
丹·艾伦 +
-
艾米尔 +
-
埃里克·维瑟
-
格雷·贝克 +
-
马克西姆·沙布宁 +
-
马尔滕·范克尔维克
-
马蒂·皮卡斯
-
彼得·安德烈亚斯·恩切夫 +
-
拉尔夫·戈默斯
-
理查德·哈里斯 +
-
塞巴斯蒂安·伯格
-
谢尔盖·列别杰夫 +
-
斯蒂芬·霍耶
合并的拉取请求
总共有 23 个拉取请求合并到了这个版本。
-
#13742:ENH:在 setup.py 中添加项目 URL
-
#13823:TEST, ENH:为 PyPy 修复了测试和 ctypes 代码
-
#13845:BUG:使用 npy_intp 而不是 int 来对数组进行索引
-
#13867:TST:在 nose 导入期间忽略 DeprecationWarning
-
#13905:BUG:修复在布尔索引中的使用后释放。
-
#13933:维护/BUG/DOC:修复 _add_newdocs 中的错误。
-
#13984:BUG:修复 datetime64[ns]的字节顺序翻转
-
#13994:MAINT, BUG:使用 nbytes 也捕捉到内存描述器分配中的空描述。
-
#14042:BUG:np.array 清空了在 PyMemoryView_FromObject 中发生的错误
-
#14043:BUG:修复未定义行为清理器(UBSan)错误。
-
#14044:BUG:确保对/从结构化的强制类型转换得到适当检查。
-
#14045:维护:修复 histogram*d 分发器
-
#14046:BUG:对 histogram2d 分发器进行进一步修正。
-
#14052:BUG:为 Python 2.7 替换 contextlib.suppress。
-
#14056:BUG:修复第三方模块与 Py_LIMITED_API 的编译…
-
#14057:BUG:修复字典构造函数中的内存泄漏。
-
#14058:DOC:在更高层次上记录数组函数。
-
#14084:BUG, DOC:将新的 recfunctions 添加到_all_*中
-
#14162: BUG:移除在 Python 3.7 上导致 SystemError 的杂乱打印
-
#14297: TST:将 pytest 版本固定为 5.0.1。
-
#14322: ENH:在所有 Linux 构建中启用大页面
-
#14346: BUG:修复在非平凡情况下 structured_to_unstructured 的行为…
-
#14382: REL:为 NumPy 1.16.5 发布做准备。
贡献者
总共有 18 人为此发布做出了贡献。带有“+”标记的人第一次为此发布贡献了补丁。
-
Alexander Shadchin
-
Allan Haldane
-
Bruce Merry+
-
Charles Harris
-
Colin Snyder+
-
Dan Allan+
-
Emile+
-
Eric Wieser
-
Grey Baker+
-
Maksim Shabunin+
-
Marten van Kerkwijk
-
Matti Picus
-
Peter Andreas Entschev+
-
Ralf Gommers
-
Richard Harris+
-
Sebastian Berg
-
Sergei Lebedev+
-
Stephan Hoyer
合并的拉取请求
总共有 23 个拉取请求被合并到此版本中。
-
#13742: 增强:在 setup.py 中添加项目网址
-
#13823: TEST, ENH:修复对 PyPy 的测试和 ctypes 代码
-
#13845: BUG:使用 npy_intp 而不是 int 进行数组索引
-
#13867: TST:在 nose 导入期间忽略 DeprecationWarning
-
#13905: BUG:修复布尔索引中的使用后释放
-
#13933: MAINT/BUG/DOC:修复 _add_newdocs 中的错误
-
#13984: BUG:修复 datetime64[ns] 的字节顺序反转
-
#13994: MAINT,BUG:使用 nbytes 以捕捉分配时的空 descr
-
#14042: BUG:修复在 PyMemoryView_FromObject 中发生的 np.array 清空错误
-
#14043: BUG:修复未定义行为检查器(UBSan)错误。
-
#14044: BUG:确保对/从 structured 的强制转换得到妥善检查。
-
#14045: MAINT:修复 histogram*d dispatchers
-
#14046: BUG:对 histogram2d dispatcher 进行进一步修复。
-
#14052: BUG:为 Python 2.7 替换 contextlib.suppress
-
#14056: BUG:修复使用 Py_LIMITED_API 编译第三方模块…
-
#14057: BUG:修复 dict 构造函数中的内存泄漏
-
#14058: DOC:更高级别地记录 array_function。
-
#14084: BUG, DOC:将新的 recfunctions 添加到 all
-
#14162: BUG:移除在 Python 3.7 上导致 SystemError 的杂乱打印
-
#14297: TST: 将 pytest 版本固定为 5.0.1。
-
#14322: ENH: 在所有 Linux 构建中启用巨大页面
-
#14346: BUG: 修复 structured_to_unstructured 在非平凡情况下的行为…
-
#14382: REL: 准备 NumPy 1.16.5 版本的发布。
NumPy 1.16.4 发行说明
NumPy 1.16.4 发布版本修复了针对 1.16.3 发布版本报告的错误,并且还从主分支中回溯了几个看起来适合作为最后支持 Python 2.7 发布系列的增强功能。在 PyPI 上的 wheels 与 OpenBLAS v0.3.7-dev 进行了链接,这可以解决 Skylake 系列 CPU 上的问题。
构建此发布版本的下游开发人员应使用 Cython >= 0.29.2,并且,如果使用 OpenBLAS,则 OpenBLAS > v0.3.7。支持的 Python 版本是 2.7 和 3.5-3.7。
新的弃用项
C-API 包装数组的可写标志
当从 C-API 创建数组以包装一个指向数据的指针时,我们唯一可以判断数据读写性质的方式是在创建时设置 writeable
标志。强制该标志为可写是危险的。未来将不可能从 Python 中将可写标志切换为 True
。此弃用项不会影响许多用户,因为以这种方式创建的数组在实践中非常罕见,并且仅通过 NumPy C-API 可用。
兼容性说明
对随机流的潜在更改
由于在将对随机浮点数进行对数操作时出现 bug,因此在从np.random.beta
、np.random.binomial
、np.random.laplace
、np.random.logistic
、np.random.logseries
或np.random.multinomial
进行采样时,流可能会发生变化,如果在底层 MT19937 随机流中生成了一个 0。发生这种情况的概率为 (10^{53}) 中的 1,因此针对任何给定的种子,流发生变化的概率是非常小的。如果在底层生成器中遇到 0,则现在会放弃生成的错误值(np.inf
或 np.nan
)。
变更
numpy.lib.recfunctions.structured_to_unstructured
不会挤压单字段视图
之前 structured_to_unstructured(arr[['a']])
会产生一个与 structured_to_unstructured(arr[['a', b']])
不一致的挤压结果。这是意外的。旧的行为可以通过structured_to_unstructured(arr[['a']]).squeeze(axis=-1)
或者更简单的arr['a']
来保留。
贡献者
总共有 10 人贡献了这个发布版本。名字旁边带有“+”符号的人是首次贡献补丁的。
-
Charles Harris
-
Eric Wieser
-
Dennis Zollo +
-
Hunter Damron +
-
Jingbei Li +
-
Kevin Sheppard
-
Matti Picus
-
Nicola Soranzo +
-
Sebastian Berg
-
Tyler Reddy
合并的拉取请求
总共有 16 个拉取请求合并到了这个发布版本中。
-
#13392: BUG:某些 PyPy 版本缺少 PyStructSequence_InitType2。
-
#13394: MAINT, DEP: 修复了弃用的
assertEquals()
-
#13396: BUG: 修复了单字段类型上的 structured_to_unstructured(回溯)
-
#13549: BLD: 使 CI 通过 pytest 4.5
-
#13552: TST: 在 conftest.py 中注册标记
-
#13559: BUG: 在 arraymultiter_new 中去除空 kwargs 的 ValueError
-
#13560: BUG: 在 crackfortran 中添加 TypeError 到接受的异常中
-
#13561: BUG: 在 descr_to_dtype 中处理子数组
-
#13562: BUG: 保护生成器不受 log(0.0)的影响
-
#13563: BUG: 从 structured_to_unstructured 中始终返回视图
-
#13564: BUG: 检查编译器版本时捕获 stderr 输出
-
#13565: BUG: longdouble(int) 无法正常工作
-
#13587: BUG: distutils/system_info.py 修复丢失的 subprocess 导入(#13523)
-
#13620: BUG,DEP: 修复没有基础的数组设置为可写标志
-
#13641: MAINT: 为 1.16.4 版本做准备。
-
#13644: BUG: 特殊情况下,当打印相对误差、绝对误差时处理对象数组
新的废弃通知
C-API 封装数组的可写标志
当从 C-API 创建数组以包装数据指针时,我们唯一可以得知数据可读写性质的指示是在创建过程中设置writeable
标志。强制将标志设置为可写是危险的。在未来,不可能从 Python 将可写标志切换为True
。此废弃应不会影响许多用户,因为用这种方式创建的数组在实践中非常罕见,并且仅能通过 NumPy C-API 获得。
C-API 封装数组的可写标志
当从 C-API 创建数组以包装数据指针时,我们唯一可以得知数据可读写性质的指示是在创建过程中设置writeable
标志。强制将标志设置为可写是危险的。在未来,不可能从 Python 将可写标志切换为True
。此废弃应不会影响许多用户,因为用这种方式创建的数组在实践中非常罕见,并且仅能通过 NumPy C-API 获得。
兼容性说明
随机流的潜在变更
由于在对随机浮点数应用对数的程序中存在 bug,如果在从 np.random.beta
、np.random.binomial
、np.random.laplace
、np.random.logistic
、np.random.logseries
或 np.random.multinomial
中取样时在底层 MT19937 随机流中生成了一个 0,流可能会发生变化。这种情况发生的概率是 (10^{53}) 中的 1,因此对于任何给定的种子,流发生变化的概率极小。如果在底层生成器中遇到 0,那么现在会丢弃产生的错误值(np.inf
或 np.nan
)。
随机流的潜在变化
由于在对随机浮点数应用对数时的 bug,如果在底层 MT19937 随机流中生成了一个 0,那么从 np.random.beta
、np.random.binomial
、np.random.laplace
、np.random.logistic
、np.random.logseries
或 np.random.multinomial
中取样时,流可能会发生变化。这种情况发生的概率是 (10^{53}) 中的 1,因此对于任何给定的种子,流发生变化的概率极小。如果在底层生成器中遇到 0,那么现在会丢弃产生的错误值(np.inf
或 np.nan
)。
变更
numpy.lib.recfunctions.structured_to_unstructured
不会压缩单字段视图
之前,structured_to_unstructured(arr[['a']])
会产生一个与 structured_to_unstructured(arr[['a', b']])
不一致的被挤压的结果。这是意外的。可以使用 structured_to_unstructured(arr[['a']]).squeeze(axis=-1)
或更简单地使用 arr['a']
来保留旧的行为。
numpy.lib.recfunctions.structured_to_unstructured
不会压缩单字段视图
之前,structured_to_unstructured(arr[['a']])
会产生一个与 structured_to_unstructured(arr[['a', b']])
不一致的被挤压的结果。这是意外的。可以使用 structured_to_unstructured(arr[['a']]).squeeze(axis=-1)
或更简单地使用 arr['a']
来保留旧的行为。
贡献者
总共有 10 人为这个版本做出了贡献。名字后面带有“+”的人是第一次贡献补丁。
-
Charles Harris
-
Eric Wieser
-
Dennis Zollo +
-
Hunter Damron +
-
Jingbei Li +
-
Kevin Sheppard
-
Matti Picus
-
Nicola Soranzo +
-
Sebastian Berg
-
Tyler Reddy
合并的拉取请求
总共有 16 个拉取请求合并到此版本。
-
#13392: BUG: 一些 PyPy 版本缺少 PyStructSequence_InitType2。
-
#13394: MAINT, DEP: 修复已弃用的
assertEquals()
-
#13396: BUG: 修复了对单字段类型的 structured_to_unstructured(backport)
-
#13549: BLD: 使用 pytest 4.5 使 CI 重新通过。
-
#13552: TST: 在 conftest.py 中注册标记。
-
#13559: BUG: 移除 arraymultiter_new 中空 kwargs 的 ValueError。
-
#13560: BUG: 在 crackfortran 中添加 TypeError 到被接受的异常中。
-
#13561: BUG: 处理 descr_to_dtype 中的子数组。
-
#13562: BUG: 保护生成器免受 log(0.0)。
-
#13563: BUG: 在 structured_to_unstructured 中始终返回视图 when…
-
#13564: BUG: 检查编译器版本时捕获 stderr。
-
#13565: BUG: longdouble(int) 不起作用。
-
#13587: BUG: distutils/system_info.py 修复缺少的 subprocess 导入(#13523)。
-
#13620: BUG,DEP: 为没有基础的数组修复可写标志设置。
-
#13641: MAINT: 为 1.16.4 版本做准备。
-
#13644: BUG: 在打印 rel-, abs-error 时特殊处理对象数组。