NumPy 2.3.0 发行说明#

NumPy 2.3.0 版本继续致力于改进自由线程 Python 支持和注释,以及通常的错误修复集. 废弃过期,代码现代化和样式清理的数量异常. 后者对于用户来说可能不可见,但对于长期的代码维护而言非常重要. 请注意,我们还从 manylinux2014 升级到 manylinux_2_28.

在具有 M4 cpu 的 Mac 上运行的用户可能会看到关于无效值等的各种警告. 这些警告是 Accelerate 的一个已知问题. 它们很烦人,但除此之外是无害的. 苹果承诺修复它们.

此版本支持 Python 版本 3.11-3.13,Python 3.14 将在发布时获得支持.

亮点#

  • NumPy 文档中的交互式示例.

  • 使用 OpenMP 并行化构建 NumPy.

  • 初步支持 ARM 上的 Windows.

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

  • 改进了注释.

新函数#

新函数 numpy.strings.slice#

添加了新函数 numpy.strings.slice ,它实现了字符串数组的快速本地切片.它支持完整的切片 API,包括负切片偏移量和步长.

( gh-27789 )

弃用#

  • 不建议使用 numpy.typing.mypy_plugin ,而是倾向于平台无关的静态类型推断.请从您的 mypy 配置的 plugins 部分删除 numpy.typing.mypy_plugin .如果此更改导致报告新的错误,请提交 issue.

    ( gh-28129 )

  • numpy.typing.NBitBase 类型已被弃用,将在未来版本中删除.

    此类型以前旨在用作类型参数的通用上限,例如:

    import numpy as np
    import numpy.typing as npt
    
    def f[NT: npt.NBitBase](x: np.complexfloating[NT]) -> np.floating[NT]: ...
    

    但在 NumPy 2.2.0 中, float64complex128 已更改为具体子类型,导致静态类型检查器拒绝 x: np.float64 = f(np.complex128(42j)) .

    因此,更好的方法是使用 typing.overload :

    import numpy as np
    from typing import overload
    
    @overload
    def f(x: np.complex64) -> np.float32: ...
    @overload
    def f(x: np.complex128) -> np.float64: ...
    @overload
    def f(x: np.clongdouble) -> np.longdouble: ...
    

    ( gh-28884 )

过期的弃用#

  • 从 Cython 接口中删除已弃用的宏,如 NPY_OWNDATA ,而支持 NPY_ARRAY_OWNDATA (自 1.7 起已弃用)

    ( gh-28254 )

  • 删除 numpy/npy_1_7_deprecated_api.h 和 C 宏,如 NPY_OWNDATA ,而支持 NPY_ARRAY_OWNDATA (自 1.7 起已弃用)

    ( gh-28254 )

  • 删除 generate_divbyzero_errornpy_set_floatstatus_divbyzerogenerate_overflow_errornpy_set_floatstatus_overflow 的别名(自 1.10 起已弃用)

    ( gh-28254 )

  • 删除 np.tostring (自 1.19 起已弃用)

    ( gh-28254 )

  • 对非数字类型使用 np.conjugate 会引发异常(自 1.13 起已弃用)

    ( gh-28254 )

  • 使用 np.bincount(...minlength=None) 时引发异常,请改用 0(自 1.14 起已弃用)

    ( gh-28254 )

  • shape=None 传递给具有非可选 shape 参数的函数会出错,请改用 () (自 1.20 起已弃用)

    ( gh-28254 )

  • modesearchside 的不精确匹配会引发异常(自 1.20 起已弃用)

    ( gh-28254 )

  • 设置 __array_finalize__ = None 会出错(自 1.23 起已弃用)

    ( gh-28254 )

  • np.fromfilenp.fromstring 在数据错误时会出错,以前它们会猜测(自 1.18 起已弃用)

    ( gh-28254 )

  • 使用元组构造 datetime64timedelta64 不再接受"事件"值,请使用 (unit, num) 的二元组或 (unit, num, den, 1) 的四元组(自 1.14 起已弃用)

    ( gh-28254 )

  • 从具有 dtype 属性的类构造 dtype 时,该属性必须是 dtype 实例,而不是可以解析为 dtype 实例的内容(在 1.19 中已弃用).在某个时候,使用 dtype 属性的整个构造将被弃用(参见 #25306)

    ( gh-28254 )

  • 将布尔值作为 partition index 会出错(自 1.23 起已弃用)

    ( gh-28254 )

  • 即使在空数组上,超出范围的索引也会出错(自 1.20 起已弃用)

    ( gh-28254 )

  • np.tostring 已被删除,请改用 tobytes (自 1.19 起已弃用)

    ( gh-28254 )

  • 禁止为具有不拥有其数据的基本数组的数组设置不可写数组为可写(自 1.17 起已弃用)

    ( gh-28254 )

  • 默认情况下,带有 axis=Noneconcatenate() 使用 same-kind 强制转换,而不是 unsafe (自 1.20 起已弃用)

    ( gh-28254 )

  • 反序列化具有 object dtype 的标量会出错(自 1.20 起已弃用)

    ( gh-28254 )

  • fromstring 的二进制模式现在会出错,请改用 frombuffer (自 1.14 起已弃用)

    ( gh-28254 )

  • np.inexactnp.floating 转换为 dtype 会出错(自 1.19 起已弃用)

    ( gh-28254 )

  • np.complex , np.integer , np.signedinteger , np.unsignedinteger , np.generic 转换为 dtype 会出错(自 1.19 起已弃用)

    ( gh-28254 )

  • Python 内置的 round 函数对于复数标量会出错.请改用 np.roundscalar.round (自 1.19 起已弃用)

    ( gh-28254 )

  • ‘np.bool’ 标量不能再解释为索引(自 1.19 起已弃用)

    ( gh-28254 )

  • 不再支持通过浮点字符串解析整数.(自 1.23 起已弃用)要避免此错误,您可以 * 确保原始数据存储为整数. * 使用 converters=float 关键字参数. * 使用 np.loadtxt(...).astype(np.int64)

    ( gh-28254 )

  • 长度为 1 的元组用于 ufunc signature 会出错.使用 dtype 或用 None 填充元组(自 1.19 起已弃用)

    ( gh-28254 )

  • 移除了 np.outer 中对矩阵的特殊处理.通过 matrix.A 转换为 ndarray(自 1.20 版本起已弃用)

    ( gh-28254 )

  • 移除了 np.compat 包源代码 (已在 2.0 中移除)

    ( gh-28961 )

C API 变更#

  • 现在可以使用 NpyIter_GetTransferFlags 来检查迭代器是否需要 Python API 或者类型转换是否会导致浮点错误 (FPE).例如,将 float64(1e300) 转换为 float32 (溢出到 infinity)或将 NaN 转换为整数(无效值)可能会设置 FPE.

    ( gh-27883 )

  • NpyIter 现在对其支持的操作数数量没有限制.

    ( gh-28080 )

新的 NpyIter_GetTransferFlagsNpyIter_IterationNeedsAPI 更改#

NumPy 现在有了新的 NpyIter_GetTransferFlags 函数,作为检查迭代器/缓冲需求的更精确方法.即,是否需要 Python API/GIL 或者可能发生浮点错误.如果您在没有缓冲的情况下已经知道您的需求,此函数也会更快.

NpyIter_IterationNeedsAPI 函数现在执行之前在设置时执行的所有检查.虽然没有必要多次调用它,但这样做现在会有更大的成本.

( gh-27998 )

新特性#

  • np.dtype 的类型参数现在默认为 typing.Any . 这样,静态类型检查器会将 dtype: np.dtype 推断为 dtype: np.dtype[Any] ,而不会报告错误.

    ( gh-28669 )

  • 静态类型检查器现在解释:

    • _: np.ndarray_: npt.NDArray[typing.Any] .

    • _: np.flatiter_: np.flatiter[np.ndarray] .

    这是因为它们的类型参数现在具有默认值.

    ( gh-28940 )

NumPy 现在使用 pkgconf PyPI 包注册其 pkg-config 路径#

pkgconf PyPI 包为像 NumPy 这样的项目提供了一个接口,用于注册它们自己的路径,以便将其添加到 pkg-config 搜索路径中.这意味着,当使用来自 PyPI 的 pkgconf 时,无需任何自定义环境配置即可发现 NumPy.

注意

注意

这仅在从 PyPI 使用 pkgconf 包时适用,或者换句话说,这仅在通过 Python 包管理器安装 pkgconf 时适用.

如果您使用的是系统提供的 pkg-configpkgconf ,或任何其他不使用 pkgconf-pypi 项目的来源,则 NumPy pkg-config 目录将不会自动添加到搜索路径中.在这些情况下,您可能需要使用 numpy-config .

( gh-28214 )

允许在 ufuncs 中使用 out=... 以确保数组结果#

NumPy 有时会表现出令人困惑的行为,即它通常返回标量而不是 0-D 数组(即使输入是 0-D 数组).对于非数字 dtype(例如 object )来说,这尤其成问题.

对于 ufuncs(即,大多数简单数学函数),现在可以使用 out=... (字面上是 ` ,例如 ``out=Ellipsis` ),它在行为上与不传递 out 相同,但将确保返回非标量返回值.这种拼写借鉴自 arr1d[0, ...] ,其中 ... 也确保返回非标量返回值.

具有 out= kwarg 的其他函数最终应获得支持.通过 __array_ufunc____array_function__ 互操作的下游库可能需要进行调整以支持此功能.

( gh-28576 )

使用 OpenMP 并行化构建 NumPy#

现在,当使用 Meson 构建标志 -Denable_openmp=true 构建 NumPy 时,它支持 OpenMP 并行处理功能. 默认情况下,此功能处于禁用状态. 启用后, np.sortnp.argsort 函数可以使用 OpenMP 进行并行线程执行,从而提高这些操作的性能.

( gh-28619 )

NumPy 文档中的交互式示例#

NumPy 文档包含许多示例,现在可以使用 WebAssembly 和 Pyodide 在浏览器中以交互方式运行这些示例.

请注意,这些示例目前本质上是实验性的,可能无法按预期用于公共 API 中的所有方法.

( gh-26745 )

改进#

  • 现在,非可比数据类型(例如 np.array(1) == np.array('s') )之间的标量比较会返回 NumPy 布尔值,而不是 Python 布尔值.

    ( gh-27288 )

  • np.nditer 现在对支持的操作数数量没有限制(C 整数).

    ( gh-28080 )

  • 现在,对于任何可以转置为 C 连续数组的数组,都支持无副本序列化.

    ( gh-28105 )

  • 用户定义的 dtype 的 __repr__ 现在优先使用自定义 dtype 的 __name__ ,而不是从其 kinditemsize 构建的更通用的名称.

    ( gh-28250 )

  • np.dot 现在会报告浮点异常.

    ( gh-28442 )

  • np.dtypes.StringDType 现在是一个 generic type ,它接受 na_object 的类型参数,默认为 typing.Never . 例如, StringDType(na_object=None) 返回一个 StringDType[None] ,而 StringDType() 返回一个 StringDType[typing.Never] .

    ( gh-28856 )

np.isclose 添加了警告#

如果 np.isclose 中的 atol 或 rtol 至少有一个是 np.nannp.inf ,则添加警告消息.

  • 警告遵循用户的 np.seterr 设置

( gh-28205 )

性能改进和变更#

np.unique 的性能改进#

np.unique 现在尝试使用哈希表来查找唯一值,而不是在查找唯一值之前对值进行排序. 这目前仅限于某些 dtype,并且该函数现在对于这些 dtype 来说更快. 该函数现在还公开了一个 sorted 参数,允许返回找到的唯一值,而不是在之后对其进行排序.

( gh-26018 )

np.sortnp.argsort 的性能改进#

np.sortnp.argsort 函数现在可以利用 OpenMP 进行并行线程执行,从而在具有 AVX2 或 AVX-512 指令的 x86 架构上实现高达 3.5 倍的加速. 此可选功能需要使用 -Denable_openmp Meson 标志构建 NumPy. 用户可以通过设置 OMP_NUM_THREADS 环境变量来控制使用的线程数.

( gh-28619 )

np.float16 类型转换的性能改进#

之前,在所有平台上,浮点类型与 np.float16 类型之间的类型转换都是在软件中模拟的.

现在,在支持 Neon float16 内在函数的 ARM 设备(例如最新的 Apple Silicon)上,将使用原生 float16 路径来实现最佳性能.

( gh-28769 )

变更#

  • 向量范数 ord=inf 和矩阵范数 ord={1, 2, inf, 'nuc'} 现在始终为空数组返回零. 空数组至少有一个大小为零的轴. 这会影响 np.linalg.norm , np.linalg.vector_normnp.linalg.matrix_norm . 以前,NumPy 会根据数组的形状引发错误或返回零.

    ( gh-28343 )

  • 修复了使用方法 np.format_float_positional 将字符串转换为浮点数时返回的错误消息中的拼写错误.

    ( gh-28569 )

  • NumPy 的 __array_api_version__ 已从 2023.12 升级到 2024.12 .

  • numpy.count_nonzero 对于 axis=None (默认值)现在返回 NumPy 标量,而不是 Python 整数.

  • numpy.take_along_axis 函数中的参数 axis 现在具有默认值 -1 .

    ( gh-28615 )

  • 通过基于浮点精度调整到科学计数法的转换,改进了 np.float16np.float32 标量和数组的打印. 为了向后兼容,添加了一个新的旧版 np.printoptions 模式 '2.2' .

    ( gh-28703 )

  • 如果字符串和整数相乘的结果会创建一个过大的字符串而无法表示时,现在会引发 OverflowError 错误,而不是 MemoryError 错误.这与 Python 的行为一致.

    ( gh-29060 )

unique_values 可能会返回未排序的数据#

相对较新的函数(在 NumPy 2.0 中添加) unique_values 现在可能会返回未排序的结果.正如 unique_countsunique_all 一样,这些函数从未保证返回排序后的结果,然而,到目前为止,结果都是排序的.在这些函数确实返回排序结果的情况下,未来版本可能会更改此行为以提高性能.

( gh-26018 )

对主迭代器的更改以及潜在的数值更改#

主迭代器在数学函数中使用,并通过 Python 中的 np.nditer 和 C 中的 NpyIter 使用,现在对于某些缓冲迭代行为不同. 这意味着:

  • 使用的缓冲区大小通常会小于 buffersize 参数允许的最大缓冲区大小.

  • 当没有操作数需要缓冲时,"growinner"标志现在在缓冲归约中生效.

对于 np.sum() ,缓冲区大小的这种变化可能会稍微改变浮点运算的数值结果.对于使用"growinner"进行自定义归约的用户,可能会注意到精度的变化(例如,在 NumPy 中,我们将其从 einsum 中删除,以避免大多数精度变化并提高某些 64 位浮点输入的精度).

( gh-27883 )

现在支持的最低 GCC 版本是 9.3.0#

支持的最低版本已从 8.4.0 更新到 9.3.0,主要目的是减少旧 GCC 版本中特定于平台的 bug 导致问题的可能性.

( gh-28102 )

numpy.histogram 中自动分箱选择的更改#

numpy.histogram 中的自动分箱选择算法已修改,以避免低变化样本的内存不足错误. 为了完全控制所选分箱,用户可以使用 numpy.histogrambinrange 参数.

( gh-28426 )

构建 manylinux_2_28 wheel#

linux 系统的 Wheel 将使用 manylinux_2_28 标签(而不是 manylinux2014 标签),这意味着根据 PEP 600 support table ,将不再支持 redhat7/centos7,amazonlinux2,debian9,ubuntu18.04 和其他 pre-glibc2.28 操作系统版本.

( gh-28436 )

在 macOS 上移除 -Wl,-ld_classic 的使用#

在 macOS 上移除 -Wl,-ld_classic 的使用. Spack 不再需要此 hack,并且会导致库无法链接到使用 ld (new) 构建的其他库.

( gh-28713 )

重新启用 numpy.strings 中函数的覆盖#

重新启用 numpy.strings 模块中函数的覆盖.

( gh-28741 )