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 )

兼容性说明#

  • rowvar=False 时, numpy.cov 现在可以正确地转置单行(二维数组)设计矩阵.之前,单行设计矩阵在这种情况下会返回一个标量,这是不正确的,所以这是一个行为改变,现在将返回一个适当形状的数组.

    ( 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.floatingx: np.floating[Any] ,即使在严格模式下也是如此.

    ( gh-27736 )

改进#

  • datetime64timedelta64 哈希现在可以正确地匹配 Pythons 内置 datetimetimedelta 的哈希.即使对于具有不同时间单位的相等值,哈希现在也评估为相等.

    ( gh-14622 )

  • 修复了使用 StringDType 参数进行字符串 ufunc 的 promotion 相关的许多问题. 使用字符串 ufunc 混合 StringDType 和固定宽度 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 构造函数.如果您遇到问题,例如,由于失败的 doctest,您可以使用打印选项 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 已经 end of life .

( gh-27088 )

NEP 50 提升状态选项已删除#

NEP 50 提升状态设置现在已删除.它们始终是用于测试的临时手段.如果环境变量设置为除 NPY_PROMOTION_STATE=weak 以外的任何值,则会发出警告,而 _set_promotion_state_get_promotion_state 将被删除.如果代码使用了 _no_nep50_warning ,则可以在不可用时使用 contextlib.nullcontext 来替换它.

( gh-27156 )