NumPy 2.2.0 Release Notes#

NumPy 2.2.0 是一个快速版本发布,使我们恢复到通常的半年一次的发布周期。此版本进行了一些小的清理工作,并完成了新的 StringDType 的开发,同时改进了对自由线程 Python 的支持。主要亮点包括:

  • 新增函数 matvecvecmat,详情见下文。

  • 许多改进的注解。

  • 改进了对新的 StringDType 的支持。

  • 改进了对自由线程 Python 的支持。

  • 修复了 f2py 的问题。

此版本支持 Python 3.10-3.13。

弃用#

  • _add_newdoc_ufunc 现已弃用。应使用 ufunc.__doc__ = newdoc 代替。

    (gh-27735)

已过期的弃用#

  • bool(np.array([])) 和其他空数组现在将引发错误。请改用 arr.size > 0 来检查数组是否为空。

    (gh-27160)

兼容性说明#

  • numpy.covrowvar=False 时,现在会正确地转置单行(2D 数组)设计矩阵。此前,在这种情况下,单行设计矩阵会返回一个标量,这是不正确的。因此,这是一个行为更改,现在将返回适当形状的数组。

    (gh-27661)

新功能#

  • 用于矩阵-向量和向量-矩阵乘积的新函数。

    定义了两个新的通用 ufunc。

    • numpy.matvec - 矩阵-向量乘积,将参数分别视为矩阵和列向量的堆栈。

    • numpy.vecmat - 向量-矩阵乘积,将参数分别视为列向量和矩阵的堆栈。对于复数向量,会取共轭。

    这些函数是对现有的 numpy.matmul 以及 NumPy 2.0 中添加的 numpy.vecdot 的补充。

    请注意,numpy.matmul 永远不会取复共轭,即使其左侧输入是向量。而 numpy.vecdotnumpy.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)

改进#

  • datetime64timedelta64 的哈希值现在能正确匹配 Python 内置的 datetimetimedelta 的哈希值。即使对于具有不同时间单位但值相等的条目,哈希值现在也能评估为相等。

    (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.float64numpy.complex128 的类型注解现在反映它们也是内置 floatcomplex 类型的子类型。此更新可防止静态类型检查器在出现以下情况时报告错误:

    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)