NumPy 1.22.0 发布说明#

NumPy 1.22.0 是一个重要的版本,包含了 153 位贡献者通过 609 个拉取请求完成的工作。其中有许多改进,主要亮点包括:

  • 主命名空间的注解基本完成。上游是一个不断变化的目标,因此未来可能会有进一步的改进,但主要工作已经完成。这可能是此版本中最用户可见的增强功能。

  • 提供了拟议的 Array-API 的初步版本。这是创建可在 CuPy 和 JAX 等应用程序中使用的标准函数集合的一步。

  • NumPy 现在支持 DLPack 后端。DLPack 为数组(张量)数据提供了一种通用的交换格式。

  • quantilepercentile 及相关函数的新方法。新方法提供了一套文献中常见的完整方法。

  • 通用函数已重构,以实现NEP 43的大部分内容。这也解锁了未来 DType API 的实验能力。

  • 一个新的可配置分配器,供下游项目使用。

这些改进是除了正在进行的为常用函数提供 SIMD 支持、改进 F2PY 和优化文档之外的工作。

此版本支持的 Python 版本是 3.8-3.10,已停止支持 Python 3.7。请注意,Mac 轮子现在基于 OS X 10.14,而不是以前 NumPy 发布周期中使用的 10.9。10.14 是 Apple 支持的最旧版本。另请注意,32 位轮子仅适用于 Windows 上的 Python 3.8 和 3.9,所有其他轮子均为 64 位,因为 Ubuntu、Fedora 和其他 Linux 发行版已停止支持 32 位。所有 64 位轮子也与 64 位整数 OpenBLAS 链接,这应该能解决使用超大数组时偶尔遇到的问题。

已过期的弃用#

已移除已弃用的数字风格 dtype 字符串#

将字符串 "Bytes0""Datetime64""Str0""Uint32""Uint64" 用作 dtype 现在将引发 TypeError

(gh-19539)

npyio 中 loadsndfromtxtmafromtxt 的已过期弃用#

numpy.loads 在 v1.15 中已弃用,建议用户改用 pickle.loadsndfromtxtmafromtxt 均在 v1.17 中弃用——用户应改用 numpy.genfromtxt 并为 usemask 参数提供适当的值。

(gh-19615)

弃用#

在 mrecords 中使用 delimiter 作为关键字参数而非 delimitor#

numpy.ma.mrecords.fromtextfile() 中拼写错误的关键字参数 delimitor 已更改为 delimiter,使用它将发出弃用警告。

(gh-19921)

已弃用将布尔型 kth 值传递给 (arg-)partition#

numpy.partitionnumpy.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.ndarray 子类的函数使用 numpy.vectorize 进行向量化时,即使给定签名(即创建 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)

已更正 PCG64DSXMPCG64 中的 advance#

修复了 PCG64DSXMPCG64advance 方法中的一个错误。此错误仅影响在不支持 128 位整数的平台(例如 Windows 和 32 位 Linux)上,当步长大于 \(2^{64}\) 时的结果。

(gh-20049)

随机 32 位浮点变量生成中的更改#

在从均匀分布生成 32 位浮点值时存在一个错误,该错误会导致随机变量的最低有效位始终为 0。此问题已修复。

此更改影响 random.Generator 方法 randomstandard_normalstandard_exponentialstandard_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,因为 数组 API 标准 仍处于草稿状态。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 配置文件中。

[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.argminnumpy.argmax#

已将 keepdims 参数添加到 numpy.argminnumpy.argmax。如果设置为 True,则减少的轴将作为大小为一的维度保留在结果中。生成的数组具有相同的维度数,并将与输入数组进行广播。

(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)

已将 ndimaxis 属性添加到 numpy.AxisError#

现在,ndimaxis 参数也作为属性存储在每个 numpy.AxisError 实例中。

(gh-19459)

初步支持 windows/arm64 目标#

numpy 已添加对 windows/arm64 目标的支持。请注意,windows/arm64 目标尚不支持 OpenBLAS

(gh-19513)

已添加对 LoongArch 的支持#

LoongArch 是一种新的指令集,之前在 LoongArch 架构上 numpy 编译失败,因此添加了此提交。

(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.floatingnumpy.integer#

基于 Python floatint 中对应的功能,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)

ndarraydtypenumber 现在支持运行时下标访问#

模仿 PEP 585numpy.ndarraynumpy.dtypenumpy.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_normalsmallest_subnormal 属性#

属性 smallest_normalsmallest_subnormal 可作为 finfo 类的扩展用于任何浮点数据类型。要使用这些新属性,请编写 np.finfo(np.float64).smallest_normalnp.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)

quantilepercentile 添加新方法#

quantilepercentile 现在有一个 method= 关键字参数,支持 13 种不同的方法。这取代了 interpolation= 关键字参数。

这些方法现在与科学文献和 R 语言中可以找到的九种方法保持一致。其余方法是默认“线性”方法以前的不连续变体。

有关更多信息,请参阅 numpy.percentile 的文档。

(gh-19857)

已将缺失参数添加到 nan<x> 函数#

许多 nan<x> 函数以前缺少其基于 <x> 的对应函数中存在的参数,例如 where 参数存在于 numpy.mean 中,但缺少于 numpy.nanmean

以下参数现已添加到 nan<x> 函数中:

  • nanmin: initialwhere

  • nanmax: initialwhere

  • nanargmin: keepdimsout

  • nanargmax: keepdimsout

  • nansum: initialwhere

  • nanprod: initialwhere

  • nanmean: where

  • nanvar: where

  • nanstd: where

(gh-20027)

注解主 NumPy 命名空间#

从 1.20 版本开始,NumPy 库的部分内容已包含 PEP 484 类型注解;其余函数的注解工作仍在进行中。随着 1.22 版本的发布,主 NumPy 命名空间的此过程已完成,现在已完全注解。

除了主命名空间之外,少数子包也包含注解。其中包括 numpy.testingnumpy.linalgnumpy.random(自 1.21 版本起可用)等。

(gh-20217)

使用 AVX-512 对 umath 模块进行向量化#

通过利用 Intel Short Vector Math Library (SVML),18 个 umath 函数(exp2log2log10expm1log1pcbrtsincostanarcsinarccosarctansinhcoshtanharcsinharccosharctanh)已使用 AVX-512 指令集进行了向量化,支持单精度和双精度实现。此更改目前仅适用于 Linux 用户和具有 AVX-512 指令集的处理器。它分别提供了单精度和双精度函数平均 32 倍和 14 倍的加速。

(gh-19478)

OpenBLAS v0.3.18#

将测试和轮子中使用的 OpenBLAS 更新到 v0.3.18

(gh-20058)