NumPy 2.2.0 Release Notes#
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 参数与字符串 ufunc 相关的提升(promotion)问题。混合使用 StringDType 和固定宽度 DTypes 的字符串 ufunc 现在应能生成更一致的结果。
(gh-27636)
改进了对空
memmap的支持。此前,除非设置了非零offset,否则一个空的memmap会失败。现在,即使offset=0,零大小的memmap也得到了支持。为了实现这一点,如果一个memmap被映射到一个空文件,该文件将被填充一个字节。(gh-27723)
f2py 现在支持多个模块,并能再次暴露变量#
修复了一个回归问题,该问题允许 F2PY 用户在仅包含赋值的模块中将变量暴露给 Python,同时也解决了单个源文件中存在多个模块的情况。
(gh-27695)
性能改进和更改#
改进了在自由线程构建中,当许多线程同时调用相同的 ufunc 操作时,多线程的扩展性。
(gh-27896)
NumPy 现在为协议使用了“fast-on-failure”属性查找。这可以大大减少函数调用或数组创建的开销,尤其是在使用自定义 Python 对象时。在 Python 3.12 或更高版本上会有最大的性能提升。
(gh-27119)
x86_64 和 i686 上的 OpenBLAS 使用更少的内核进行构建。根据基准测试,在这些内核周围有 5 个性能集群:
PRESCOTT NEHALEM SANDYBRIDGE HASWELL SKYLAKEX。Windows 上的 OpenBLAS 不再链接 quadmath,从而简化了许可。
由于 OpenBLAS 在 Windows 上出现回归,因此恢复了使用多个线程对 OpenBLAS 0.3.26 的性能改进。
(gh-27147)
NumPy 现在也会为 Linux 上大的
np.zeros分配指示 hugepages。这通常应该能提高性能。(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 promotion state 选项已移除#
NEP 50 promotion state 设置现已移除。它们一直被视为临时测试手段。如果环境变量设置为 NPY_PROMOTION_STATE=weak 以外的任何值,则会发出警告,并且 _set_promotion_state 和 _get_promotion_state 已被移除。如果代码使用了 _no_nep50_warning,在无法使用时,可以使用 contextlib.nullcontext 来替代。
(gh-27156)