NumPy 1.22.0 发布说明#
NumPy 1.22.0 是一个重要的版本,有 153 位贡献者通过 609 个合并请求贡献了工作。本次版本有许多改进,亮点如下:
主要命名空间中的注释基本完成。上游项目是动态变化的,因此可能会有进一步的改进,但主要工作已经完成。这可能是本次发布中最能让用户感知到的增强功能。
提供了 Array-API 的初步版本。这是创建一套标准函数集合的步骤,这些函数可用于 CuPy 和 JAX 等应用程序。
NumPy 现在具有 DLPack 后端。DLPack 为数组(张量)数据提供了一个通用的交换格式。
quantile、percentile和相关函数的新方法。新方法提供了文献中常见的完整方法集。通用函数已重构,以实现 NEP 43 的大部分内容。这还为实验未来 DType API 提供了可能性。
为下游项目提供了一个新的可配置分配器。
此外,还有为常用函数提供 SIMD 支持的持续工作、F2PY 的改进以及更好的文档。
本次发布支持的 Python 版本为 3.8-3.10,已移除 Python 3.7。请注意,Mac wheel 现在基于 OS X 10.14 而不是之前 NumPy 发布周期使用的 10.9。10.14 是 Apple 支持的最旧版本。此外,仅为 Windows 上的 Python 3.8 和 3.9 提供 32 位 wheel,其他所有 wheel 均为 64 位,原因是 Ubuntu、Fedora 和其他 Linux 发行版已放弃 32 位支持。所有 64 位 wheel 都链接了 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 中将 delimitor 关键字参数改为 delimiter#
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)
移除了复数类型的地板除法支持#
复数类型的地板除法现在将导致 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)
复数 dtype 的 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 位浮点数值时存在一个错误,该错误会导致随机变量的最低有效位始终为 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 允许实验用于改进通用函数和特别是用户 DType 支持的未来 API。此时,建议使用 NumPy 的开发版本进行实验,因为预计会有一些更改,并且将解锁新功能。
(gh-19919)
新功能#
NEP 49 可配置分配器#
如 NEP 49 所述,可以更改用于 ndarray 数据段分配的函数。策略可以全局设置或在上下文中设置。有关更多信息,请参阅 NEP 和 NumPy 中的内存管理 参考文档。还添加了一个 NUMPY_WARN_IF_NO_MEM_POLICY 覆盖,以警告通过设置 NPY_ARRAY_OWNDATA 转移所有权的危险用法。
(gh-17582)
实现 NEP 47(采用 Array API 标准)#
NEP 47(采用 Array API 标准)的初步实现已作为 numpy.array_api 添加。该实现是实验性的,并在导入时发出 UserWarning,因为 Array API 标准仍处于草案状态。numpy.array_api 是 Array API 标准的符合性实现,它也是最小化的,意味着仅实现了标准要求的功能和行为(有关详细信息,请参阅 NEP)。鼓励希望利用 Array API 标准的库使用 numpy.array_api 来检查它们是否仅使用了在标准符合性实现中保证存在的功能。
(gh-18585)
现在可以从注释块生成 C/C++ API 参考文档#
此功能在生成过程中依赖于 Doxygen,在与 Sphinx 集成时依赖于 Breathe。
(gh-18884)
通过 mypy 插件分配平台特定的 c_intp 精度#
在 numpy/numpy#17843 中引入的 mypy 插件已再次扩展:该插件现在负责设置 numpy.ctypeslib.c_intp 的平台特定精度,后者用作各种 numpy.ndarray.ctypes 属性的数据类型。
如果没有该插件,上述类型将默认为 ctypes.c_int64。
要启用该插件,必须将其添加到 mypy 的 配置文件中。
[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)
计算整数中 1 的数量的 bit_count 方法#
计算输入绝对值中 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 目标的支持。请注意,windows/arm64 目标尚不支持 OpenBLAS。
(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 中添加了一个新的符号解析器,以正确解析维度规范。该解析器是未来改进的基础,并提供了与 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 现在可以接受任何类路径对象#
中的所有参数现在都可以接受任何 类路径对象。这包括字符串、字节和实现了 __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 短向量数学库 (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#
将用于测试和 wheel 的 OpenBLAS 更新到 v0.3.18。
(gh-20058)