NumPy 2.2.0 发行说明#
NumPy 2.2.0 版本是一个快速发布版,它使我们回到了一年两次的常规发布周期。此版本进行了一些小的清理工作,并完成了新的 StringDType 的开发,同时改进了对自由线程 Python 的支持。主要亮点包括:
新增函数
matvec
和vecmat
,详见下文。多处改进的注解。
改进了对新 StringDType 的支持。
改进了对自由线程 Python 的支持。
f2py 的修复。
此版本支持 Python 3.10-3.13 版本。
弃用#
_add_newdoc_ufunc
现已弃用。ufunc.__doc__ = newdoc
应替代使用。(gh-27735)
已过期的弃用#
bool(np.array([]))
和其他空数组现在将引发错误。请改用arr.size > 0
来检查数组是否包含元素。(gh-27160)
兼容性说明#
新特性#
用于矩阵-向量和向量-矩阵乘积的新函数
定义了两个新的广义 ufunc
numpy.matvec
- 矩阵-向量乘积,分别将参数视为矩阵和列向量的堆栈。numpy.vecmat
- 向量-矩阵乘积,分别将参数视为列向量和矩阵的堆栈。对于复数向量,将取共轭。
这些函数是对现有
numpy.matmul
以及 NumPy 2.0 中新增的numpy.vecdot
的补充。请注意,
numpy.matmul
从不取复共轭,即使其左侧输入是向量时也是如此,而numpy.vecdot
和numpy.vecmat
都会对左侧的复数向量取共轭(这些向量被认为是转置的,遵循物理约定)。(gh-25675)
np.complexfloating[T, T]
现在也可以写为np.complexfloating[T]
(gh-27420)
UFuncs 现在支持
__dict__
属性并允许覆盖__doc__
(直接或通过ufunc.__dict__["__doc__"]
)。__dict__
还可以用于覆盖其他属性,例如__module__
或__qualname__
。(gh-27735)
np.number
及其子类型的“nbit”类型参数现在默认为typing.Any
。这样,即使在严格模式下,类型检查器也会将诸如x: np.floating
之类的注解推断为x: np.floating[Any]
。(gh-27736)
改进#
datetime64
和timedelta64
的哈希值现在与 Python 内置的datetime
和timedelta
的哈希值正确匹配。即使对于具有不同时间单位但值相等的情况,哈希值现在也评估为相等。(gh-14622)
修复了使用 StringDType 参数的字符串 ufuncs 在提升方面的一些问题。现在,混合使用 StringDType 和固定宽度 DType 的字符串 ufuncs 应该会生成更统一的结果。
(gh-27636)
改进了对空
memmap
的支持。以前,除非设置了非零offset
,否则空memmap
会失败。现在,即使offset=0
,也支持零大小的memmap
。为了实现这一点,如果memmap
映射到空文件,则该文件将填充一个字节。(gh-27723)
f2py
再次处理多个模块并公开变量#
修复了一个回归问题,该问题允许 F2PY 用户在只有赋值的模块中向 Python 公开变量,并修复了单个源文件中存在多个模块的情况。
(gh-27695)
性能改进和变更#
在自由线程构建中,当许多线程同时调用相同的ufunc操作时,多线程伸缩性得到改善。
(gh-27896)
NumPy 现在为协议使用快速失败的属性查找。这可以大大减少函数调用或数组创建的开销,特别是对于自定义 Python 对象。最大的改进将在 Python 3.12 或更高版本上体现。
(gh-27119)
OpenBLAS 在 x86_64 和 i686 上构建时,使用的内核更少。根据基准测试,这些内核的性能围绕 5 个集群:
PRESCOTT NEHALEM SANDYBRIDGE HASWELL SKYLAKEX
。Windows 上的 OpenBLAS 链接时没有 quadmath,从而简化了许可。
由于 OpenBLAS 0.3.26 在 Windows 上存在回归问题,使用多线程时的性能改进已被撤销。
(gh-27147)
NumPy 现在还在 Linux 上为大型
np.zeros
分配指示大页。这通常会提高性能。(gh-27808)
变更#
numpy.fix
对于整数和布尔数据类型输入数组,现在不会执行转换为浮点数据类型的操作。(gh-26766)
numpy.float64
和numpy.complex128
的类型注解现在反映出它们也是内置float
和complex
类型子类的特点。此更新可防止静态类型检查器在以下情况中报告错误:x: float = numpy.float64(6.28) # valid z: complex = numpy.complex128(-1j) # valid
(gh-27334)
足够大以进行汇总(即元素被
...
替换)的数组的repr
现在包含数组的shape
,这类似于零大小且形状不明显的数组的情况。通过此更改,当形状无法从值推断时,将始终给出形状。请注意,虽然写为shape=...
,但此参数实际上无法传递给np.array
构造函数。如果遇到问题,例如 doctests 失败,可以使用打印选项legacy=2.1
来获得旧行为。(gh-27482)
现在,直接在 NumPy 数组或标量上调用
__array_wrap__
并在传递return_scalar
时(NumPy 2 中添加)会正确执行。此外,现在可以在非标量结果上安全地调用标量__array_wrap__
。(gh-27807)
将 musllinux CI 镜像和 wheels 从 1_1 更新到 1_2。这是因为 1_1 已经生命周期结束。
(gh-27088)
NEP 50 提升状态选项已移除#
NEP 50 提升状态设置现已移除。它们一直仅作为临时测试手段。如果环境变量设置为 NPY_PROMOTION_STATE=weak
以外的任何值,将发出警告,同时 _set_promotion_state
和 _get_promotion_state
将被移除。如果代码使用了 _no_nep50_warning
,在不可用时可以使用 contextlib.nullcontext
替换它。
(gh-27156)