NumPy 2.2.0 版本说明#

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.cov 现在在 rowvar=False 时会正确转置单行(二维数组)设计矩阵。以前,在这种情况下,单行设计矩阵将返回一个标量,这是不正确的,因此这是一个行为更改,现在将返回具有适当形状的数组。

    (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 提升的许多问题。现在,混合使用 StringDType 和使用字符串 ufunc 的定宽 DType 应该会产生更统一的结果。

    (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)

  • 在 x86_64 和 i686 上的 OpenBLAS 使用更少的内核构建。根据基准测试,这些内核周围有 5 个性能集群:PRESCOTT NEHALEM SANDYBRIDGE HASWELL SKYLAKEX

  • Windows 上的 OpenBLAS 在没有 quadmath 的情况下链接,简化了许可。

  • 由于 Windows 上 OpenBLAS 的回归,使用多个线程的 OpenBLAS 0.3.26 的性能改进已恢复。

    (gh-27147)

  • NumPy 现在也为 Linux 上的大型 np.zeros 分配指示巨页。因此通常应该提高性能。

    (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构造函数。如果您遇到问题,例如由于文档测试失败,您可以使用打印选项legacy=2.1来获得旧的行为。

    (gh-27482)

  • 当传递return_scalar时,直接在NumPy数组或标量上调用__array_wrap__现在会执行正确的操作(在NumPy 2中添加)。现在,在非标量结果上调用标量__array_wrap__也是安全的。

    (gh-27807)

将musllinux CI镜像和轮子从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)