NumPy 1.22.0 发行说明#
NumPy 1.22.0 是一个重要的版本,包含了 153 位贡献者在 609 个 pull request 中所做的工作. 有很多改进,亮点如下:
主命名空间的注释基本上完成了. 上游是一个移动的目标,因此可能会有进一步的改进,但主要工作已经完成. 这可能是此版本中最明显的用户增强功能.
提供了拟议的 Array-API 的初步版本. 这是创建一个标准函数集合的一步,该集合可用于 CuPy 和 JAX 等应用程序.
NumPy 现在有一个 DLPack 后端. DLPack 为数组(张量)数据提供了一种通用的交换格式.
quantile,percentile和相关函数的新方法. 新方法提供了一套完整的文献中常见的的方法.通用函数已被重构,以实现 NEP 43 的大部分功能. 这也解锁了试验未来 DType API 的能力.
一个可配置的分配器,供下游项目使用.
除了为常用函数提供 SIMD 支持,改进 F2PY 和更好的文档之外,还在进行其他工作.
此版本支持的 Python 版本为 3.8-3.10,已移除 Python 3.7.请注意,Mac wheels 现在基于 OS X 10.14,而不是之前 NumPy 版本周期中使用的 10.9.10.14 是 Apple 支持的最旧版本.另请注意,32 位 wheels 仅在 Windows 上的 Python 3.8 和 3.9 上提供,所有其他 wheels 均为 64 位,因为 Ubuntu,Fedora 和其他 Linux 发行版已停止支持 32 位.所有 64 位 wheels 也都与 64 位整数 OpenBLAS 链接,这应该可以解决使用非常大的数组的人偶尔遇到的问题.
过期的弃用#
已移除已弃用的数字样式 dtype 字符串#
使用字符串 "Bytes0" , "Datetime64" , "Str0" , "Uint32" , 和 "Uint64" 作为 dtype 现在会引发 TypeError .
( gh-19539 )
已过期的 npyio 中 loads , ndfromtxt 和 mafromtxt 的弃用#
numpy.loads 已在 v1.15 中弃用,建议用户改用 pickle.loads . ndfromtxt 和 mafromtxt 均在 v1.17 中弃用 - 用户应改用 numpy.genfromtxt ,并使用 usemask 参数的适当值.
( gh-19615 )
弃用#
在 mrecords 中使用 delimiter 而不是 delimitor 作为 kwarg#
numpy.ma.mrecords.fromtextfile() 的拼写错误的关键字参数 delimitor 已更改为 delimiter ,使用它将发出弃用警告.
( gh-19921 )
将布尔 kth 值传递给(arg-)partition 已被弃用#
numpy.partition 和 numpy.argpartition 之前会接受 kth 参数的布尔值,这些值随后会被转换为整数.此行为现已弃用.
( gh-20000 )
np.MachAr 类已被弃用#
numpy.MachAr 类和 finfo.machar <numpy.finfo> 属性已被弃用.鼓励用户直接从相应的 numpy.finfo 属性访问感兴趣的属性.
( gh-20201 )
兼容性说明#
Distutils 强制执行 clang 上的严格浮点模型#
NumPy 现在在 clang 上设置 -ftrapping-math 选项,以强制执行通用函数的正确浮点错误处理.否则,Clang 默认使用非 IEEE 和 C99 一致的行为.此更改 (使用等效但较新的 -ffp-exception-behavior=strict ) 在 NumPy 1.21 中尝试过,但实际上从未被使用.
( gh-19479 )
移除了对复杂类型的 floor division 支持#
复杂类型的 Floor division 现在将导致 TypeError
>>> a = np.arange(10) + 1j* np.arange(10)
>>> a // 1
TypeError: ufunc 'floor_divide' not supported for the input types...
( gh-19135 )
numpy.vectorize 函数现在生成与基础函数相同的输出类#
当使用 numpy.vectorize 对尊重 numpy.ndarray 子类的函数进行向量化时,向量化函数现在也将是子类安全的,即使给出了签名(即,在创建 gufunc 时):输出类将与第一次调用底层函数返回的类相同.
( gh-19356 )
不再支持 Python 3.7#
Python 支持已被删除.这是相当严格的,有一些更改需要 Python >= 3.8.
( gh-19665 )
complex dtypes 的 str/repr 现在在标点符号后包含空格#
np.dtype({"names": ["a"], "formats": [int], "offsets": [2]}) 的 repr 现在是 dtype({'names': ['a'], 'formats': ['<i8'], 'offsets': [2], 'itemsize': 10}) ,而空格之前在冒号后和字段之间被省略.
可以通过 np.set_printoptions(legacy="1.21") 恢复旧的行为.
( gh-19687 )
更正了 PCG64DSXM 和 PCG64 中的 advance#
修复了 PCG64DSXM 和 PCG64 的 advance 方法中的一个错误.该错误仅影响步长大于 \(2^{64}\) 且不支持 128 位整数的平台(例如,Windows 和 32 位 Linux)上的结果.
( gh-20049 )
随机 32 位浮点变量的生成方式变更#
从均匀分布生成 32 位浮点数值时存在一个 bug,会导致随机变量的最低有效位始终为 0.此问题已修复.
此更改会影响由 random.Generator 方法 random , standard_normal , standard_exponential 和 standard_gamma 生成的变量,但仅当 dtype 指定为 numpy.float32 时.
( gh-20314 )
C API 变更#
不再可以自定义掩码内部循环#
掩码内部循环选择器现在永远不会被使用.万一它被自定义,将会发出警告.
我们不希望任何代码使用它.如果您确实使用了它,则必须在较新的 NumPy 版本上取消设置该选择器.另请联系 NumPy 开发人员,我们预计会提供一种新的,更具体的机制.
该自定义是允许更快进行掩码操作的,从未实现的功能的一部分.
( gh-19259 )
实验性地公开未来的 DType 和 UFunc API#
新的头文件 experimental_public_dtype_api.h 允许试验未来的 API,以改进通用函数,特别是用户 DType 的支持.目前,建议使用 NumPy 的开发版本进行试验,因为预计会进行一些更改并且会解锁新功能.
( gh-19919 )
新特性#
NEP 49 可配置的分配器#
如 NEP 49 中详细说明的那样,可以更改用于分配 ndarray 的数据段的函数.该策略可以全局设置或在上下文中设置.有关更多信息,请参见 NEP 和 NumPy 中的内存管理 参考文档.此外,添加一个 NUMPY_WARN_IF_NO_MEM_POLICY 覆盖,以便在使用设置 NPY_ARRAY_OWNDATA 转移所有权时发出警告.
( gh-17582 )
NEP 47 的实现(采用数组 API 标准)#
NEP 47 (采用数组 API 标准) 的初始实现已作为 numpy.array_api 添加.该实现是实验性的,并且在导入时会发出 UserWarning,因为 array API standard 仍处于草案状态. numpy.array_api 是数组 API 标准的符合性实现,它也是最小的,这意味着仅实现标准要求的那些函数和行为(有关更多信息,请参见 NEP).希望利用数组 API 标准的库应使用 numpy.array_api 来检查它们是否仅使用保证在标准一致性实现中存在的功能.
( gh-18585 )
现在可以从注释块生成 C/C++ API 参考文档#
此功能取决于生成过程中的 Doxygen 以及 Breathe 以将其与 Sphinx 集成.
( gh-18884 )
通过 mypy 插件分配特定于平台的 c_intp 精度#
在 numpy/numpy#17843 中引入的 mypy 插件再次得到扩展:现在,该插件负责设置 numpy.ctypeslib.c_intp 的特定于平台的精度,后者用作各种 numpy.ndarray.ctypes 属性的数据类型.
如果没有该插件,则上述类型将默认为 ctypes.c_int64 .
要启用该插件,必须将其添加到他们的 mypy configuration file 中:
[mypy]
plugins = numpy.typing.mypy_plugin
( gh-19062 )
添加与 NEP 47 兼容的 dlpack 支持#
添加一个 ndarray.__dlpack__() 方法,该方法返回一个包装在 PyCapsule 中的 dlpack C 结构. 此外,添加一个 np._from_dlpack(obj) 函数,其中 obj 支持 __dlpack__() ,并返回一个 ndarray .
( gh-19083 )
keepdims 可选参数已添加到 numpy.argmin , numpy.argmax#
keepdims 参数已添加到 numpy.argmin , numpy.argmax . 如果设置为 True ,则缩减的轴将保留在结果中,作为大小为 1 的维度. 生成的数组具有相同的维数,并将使用输入数组进行广播.
( gh-19211 )
bit_count 用于计算整数中 1 的位数#
计算输入值绝对值中 1 的位数.这适用于所有 numpy 整数类型.类似于内置的 int.bit_count 或 C++ 中的 popcount .
>>> np.uint32(1023).bit_count()
10
>>> np.int32(-127).bit_count()
7
( gh-19355 )
ndim 和 axis 属性已添加到 numpy.AxisError#
ndim 和 axis 参数现在也作为属性存储在每个 numpy.AxisError 实例中.
( gh-19459 )
初步支持 windows/arm64 目标#
numpy 添加了对 windows/arm64 目标的支持.请注意, OpenBLAS 支持尚未在 windows/arm64 目标上提供.
( gh-19513 )
添加了对 LoongArch 的支持#
LoongArch 是一种新的指令集,numpy 在 LoongArch 架构上的编译失败,因此添加此提交.
( gh-19527 )
添加了 .clang-format 文件#
Clang-format 是一个 C/C++ 代码格式化工具,与添加的 .clang-format 文件一起使用,它可以生成与 NumPy C_STYLE_GUIDE 非常接近的代码,可用于一般用途. 由于使用了几个新特性,因此需要 Clang-format 12+ 版本,它在 Fedora 34 和 Ubuntu Focal 以及其他发行版中可用.
( gh-19754 )
is_integer 现在可用于 numpy.floating 和 numpy.integer#
基于 Python float 和 int 中的对应部分,numpy 浮点和整数类型现在支持 float.is_integer . 如果数字是具有积分值的有限数,则返回 True ,否则返回 False .
>>> np.float32(-2.0).is_integer()
True
>>> np.float64(3.2).is_integer()
False
>>> np.int32(-2).is_integer()
True
( gh-19803 )
Fortran 维度规范的符号解析器#
一个新的符号解析器已添加到 f2py 中,以便正确解析维度规范.该解析器是未来改进的基础,并提供与 Draft Fortran 202x 的兼容性.
( gh-19805 )
ndarray , dtype 和 number 现在是运行时可下标的#
模仿 PEP 585 , numpy.ndarray , numpy.dtype 和 numpy.number 类现在可以在 python 3.9 及更高版本中进行下标操作. 因此,以前仅允许在 .pyi 存根文件或借助 from __future__ import annotations 的表达式现在在运行时也是合法的.
>>> import numpy as np
>>> from typing import Any
>>> np.ndarray[Any, np.dtype[np.float64]]
numpy.ndarray[typing.Any, numpy.dtype[numpy.float64]]
( gh-19879 )
改进#
ctypeslib.load_library 现在可以接受任何 path-like 对象#
现在,其中的所有参数都可以接受任何 path-like object . 这包括字符串,字节和实现 __fspath__ 协议的对象.
( gh-17530 )
向 finfo 添加 smallest_normal 和 smallest_subnormal 属性#
属性 smallest_normal 和 smallest_subnormal 可用作任何浮点数据类型的 finfo 类的扩展. 要使用这些新属性,请编写 np.finfo(np.float64).smallest_normal 或 np.finfo(np.float64).smallest_subnormal .
( gh-18536 )
numpy.linalg.qr 接受堆叠矩阵作为输入#
numpy.linalg.qr 能够为堆叠矩阵生成结果作为输入. 此外,QR 分解的实现已从 Python 转移到 C.
( gh-19151 )
numpy.fromregex 现在接受 os.PathLike 实现#
numpy.fromregex 现在接受实现 __fspath__<os.PathLike> 协议的对象,例如 pathlib.Path .
( gh-19680 )
为 quantile 和 percentile 添加新方法#
quantile 和 percentile 现在有一个 method= 关键字参数,支持 13 种不同的方法. 这取代了 interpolation= 关键字参数.
这些方法现在与科学文献和 R 语言中的九种方法对齐. 剩下的方法是先前默认"线性"方法的不连续变体.
请查阅 numpy.percentile 的文档以获取更多信息.
( gh-19857 )
已为 nan<x> 函数添加了缺失的参数#
许多 nan<x> 函数之前缺少其基于 <x> 的对应函数中存在的参数,例如 where 参数存在于 numpy.mean 中,但不存在于 numpy.nanmean 中.
现在已为 nan<x> 函数添加了以下参数:
nanmin:
initial&wherenanmax:
initial&wherenanargmin:
keepdims&outnanargmax:
keepdims&outnansum:
initial&wherenanprod:
initial&wherenanmean:
wherenanvar:
wherenanstd:
where
( gh-20027 )
注释主要的 Numpy 命名空间#
从 1.20 版本开始,PEP 484 类型注释已包含在 NumPy 库的部分内容中;注释剩余的函数是一项正在进行的工作.随着 1.22 版本的发布,此过程已针对主要的 NumPy 命名空间完成,该命名空间现在已完全注释.
除了主命名空间之外,少数子包也包含注释.这包括 numpy.testing , numpy.linalg 和 numpy.random (自 1.21 起可用).
( gh-20217 )
使用 AVX-512 对 umath 模块进行向量化#
通过利用 Intel Short Vector Math Library (SVML),18 个 umath 函数( exp2 , log2 , log10 , expm1 , log1p , cbrt , sin , cos , tan , arcsin , arccos , arctan , sinh , cosh , tanh , arcsinh , arccosh , arctanh )使用 AVX-512 指令集为单精度和双精度实现进行了向量化.此更改目前仅适用于 Linux 用户以及具有 AVX-512 指令集的处理器.它分别为单精度和双精度函数提供了平均 32 倍和 14 倍的加速.
( gh-19478 )
OpenBLAS v0.3.18#
将测试和 wheels 中使用的 OpenBLAS 更新到 v0.3.18
( gh-20058 )