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 中使用 delimiter 而不是 delimitor 作为关键字参数#
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)
复数类型的 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
生成的变量,但仅当数据类型指定为 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 的实现(采用数组 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)
向 numpy.argmin
、numpy.argmax
添加了可选参数 keepdims
#
向 numpy.argmin
、numpy.argmax
添加了 keepdims
参数。如果设置为 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)
已向 numpy.AxisError
添加了 ndim
和 axis
属性#
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 添加了一个新的符号解析器,以便正确解析维度规范。该解析器是未来改进的基础,并提供了与 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
&where
nanmax:
initial
&where
nanargmin:
keepdims
&out
nanargmax:
keepdims
&out
nansum:
initial
&where
nanprod:
initial
&where
nanmean:
where
nanvar:
where
nanstd:
where
(gh-20027)
注释主 NumPy 命名空间#
从 1.20 版本开始,已为 NumPy 库的部分内容包含 PEP 484 类型注释;注释其余函数仍在进行中。随着 1.22 版本的发布,此过程已完成对主 NumPy 命名空间的注释,该命名空间现在已完全注释。
除了主命名空间之外,少量子包也包含注释。其中包括 numpy.testing
、numpy.linalg
和 numpy.random
(自 1.21 版本起可用)。
(gh-20217)
使用 AVX-512 将 umath 模块矢量化#
通过利用英特尔短向量数学库 (SVML),使用 AVX-512 指令集对 18 个 umath 函数(exp2
、log2
、log10
、expm1
、log1p
、cbrt
、sin
、cos
、tan
、arcsin
、arccos
、arctan
、sinh
、cosh
、tanh
、arcsinh
、arccosh
、arctanh
)进行了矢量化,适用于单精度和双精度实现。此更改目前仅对 Linux 用户以及具有 AVX-512 指令集的处理器启用。它分别为单精度和双精度函数提供了平均 32 倍和 14 倍的加速。
(gh-19478)
OpenBLAS v0.3.18#
将测试和轮子中使用的 OpenBLAS 更新到 v0.3.18
(gh-20058)