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 .如果此更改导致报告新的错误,请提交问题.

    ( 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 不再接受 event 值,可以使用 (unit, num) 的二元组或 (unit, num, den, 1) 的四元组(自 1.14 起已弃用)

    ( gh-28254 )

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

    ( gh-28254 )

  • 将布尔值作为分区索引传递会出错(自 1.23 起已弃用)

    ( gh-28254 )

  • 即使在空数组上,越界索引也会出错(自 1.20 起已弃用)

    ( gh-28254 )

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

    ( gh-28254 )

  • 不允许为不拥有其数据的基数组制造非可写数组可写(自 1.17 起已弃用)

    ( gh-28254 )

  • 默认情况下, concatenate()axis=None 一起使用 same-kind 转换,而不是 unsafe (自 1.20 起已弃用)

    ( gh-28254 )

  • 反序列化具有对象 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 (溢出到无穷大)或将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 as _: npt.NDArray[typing.Any] .

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

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

    ( gh-28940 )

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

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

注意

注意

这仅适用于使用来自 PyPIpkgconf 包时,或者换句话说, 这仅适用于通过 Python 包管理器安装 pkgconf 时.

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

( gh-28214 )

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

NumPy有时会有一些难以理解的行为,即它通常返回标量而不是0维数组(即使输入是0维数组).对于非数值的dtypes(例如 object )来说,这尤其存在问题.

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

其他带有 out= kwarg的函数最终应该会获得支持.通过 __array_ufunc____array_function__ 互操作的下游库可能需要进行调整以支持这一点.

( gh-28576 )

使用OpenMP并行化构建NumPy#

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

( gh-28619 )

NumPy文档中的交互式示例#

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

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

( gh-26745 )

改进#

  • 非可比较dtypes之间的标量比较,例如 np.array(1) == np.array('s') ,现在返回NumPy bool值而不是Python bool值.

    ( gh-27288 )

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

    ( gh-28080 )

  • 现在,对于任何可以转置为C连续数组的数组,都支持无复制pickle.

    ( gh-28105 )

  • 用户自定义dtypes的 __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 现在尝试使用哈希表来查找唯一值,而不是在查找唯一值之前对值进行排序. 这目前仅限于某些dtypes,并且该函数对于这些dtypes现在更快. 该函数现在还公开了一个 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 intrinsics 的 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 版本中特定于平台的错误导致问题的可能性.

( gh-28102 )

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

numpy.histogram 中的自动 bin 选择算法已修改,以避免低方差样本出现内存不足错误. 要完全控制所选的 bin,用户可以使用设置 binrange 参数 numpy.histogram .

( gh-28426 )

构建 manylinux_2_28 wheels#

linux 系统的 Wheels 将使用 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 )