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 轮子现在基于 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)
loads
、ndfromtxt
和 mafromtxt
在 npyio 中的已过时弃用#
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)
移除了对复数类型的整除支持#
复数类型的地板除法现在将导致 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)
复杂数据类型的 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
允许试验改进的通用函数未来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 和用于与 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)
bit_count
用于计算整数中 1-bit 的数量#
计算输入绝对值中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 是一种新的指令集,在 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.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 object.这包括字符串、字节和实现 __fspath__
协议的对象.
(gh-17530)
将 smallest_normal
和 smallest_subnormal
属性添加到 finfo
#
属性 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版本开始,PEP 484类型注解已包含在NumPy库的部分内容中;注解剩余的函数正在进行中.随着1.22版本的发布,这一过程已为主NumPy命名空间完成,现在已完全注解.
除了主命名空间外,有限数量的子包也包含注解.这包括,例如,``numpy.testing``、numpy.linalg
和 ``numpy.random``(自 1.21 版本起可用).
(gh-20217)
使用 AVX-512 向量化 umath 模块#
通过利用英特尔短向量数学库 (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#
将测试和轮子中使用的 OpenBLAS 更新到 v0.3.18
(gh-20058)