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 中,
float64和complex128被更改为具体子类型,导致静态类型检查器拒绝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_error到npy_set_floatstatus_divbyzero和generate_overflow_error到npy_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 )
mode和searchside的不精确匹配会引发错误(自 1.20 起已弃用)( gh-28254 )
设置
__array_finalize__ = None会出错(自 1.23 起已弃用)( gh-28254 )
np.fromfile和np.fromstring在数据错误时会出错,之前它们会猜测(自 1.18 起已弃用)( gh-28254 )
使用元组构造
datetime64和timedelta64不再接受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.inexact或np.floating转换为dtype会报错(自1.19版本起已弃用)( gh-28254 )
将
np.complex,np.integer,np.signedinteger,np.unsignedinteger,np.generic转换为dtype会报错(自1.19版本起已弃用)( gh-28254 )
Python内置的
round函数对于复数标量会报错.请使用np.round或scalar.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_GetTransferFlags 和 NpyIter_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.ndarrayas_: npt.NDArray[typing.Any]._: np.flatiteras_: np.flatiter[np.ndarray].
这是因为它们的类型参数现在具有默认值.
( gh-28940 )
NumPy现在使用 pkgconf PyPI package 注册其 pkg-config 路径#
pkgconf PyPI 包提供了一个接口,供像 NumPy 这样的项目注册他们自己的路径,以便添加到 pkg-config 搜索路径中.这意味着当使用来自 PyPI 的 pkgconf 时,NumPy 将是可发现的,而无需任何自定义环境配置.
注意
注意
这仅适用于使用来自 PyPI 的 pkgconf 包时,或者换句话说, 这仅适用于通过 Python 包管理器安装 pkgconf 时.
如果您使用的是系统提供的 pkg-config 或 pkgconf ,或者任何其他不使用 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.sort 和 np.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__,而不是从其kind和itemsize构造的更通用的名称.( 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.nan 或 np.inf ,则添加警告消息.
警告遵循用户的
np.seterr设置
( gh-28205 )
性能改进和更改#
np.unique 的性能改进#
np.unique 现在尝试使用哈希表来查找唯一值,而不是在查找唯一值之前对值进行排序. 这目前仅限于某些dtypes,并且该函数对于这些dtypes现在更快. 该函数现在还公开了一个 sorted 参数,允许按找到的顺序返回唯一值,而不是在之后对其进行排序.
( gh-26018 )
np.sort 和 np.argsort 的性能改进#
np.sort 和 np.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_norm和np.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.float16和np.float32标量和数组的打印.添加了一个新的遗留np.printoptions模式'2.2'以实现向后兼容.( gh-28703 )
如果乘法的结果会创建一个太大而无法表示的字符串,则字符串和整数之间的乘法现在会引发 OverflowError 而不是 MemoryError.这遵循 Python 的行为.
( gh-29060 )
unique_values 可能会返回未排序的数据#
相对较新的函数(在 NumPy 2.0 中添加) unique_values 现在可能会返回未排序的结果. 就像 unique_counts 和 unique_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,用户可以使用设置 bin 或 range 参数 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 )