NumPy 2.0.0发布

NumPy 2.0.0是自 2006 年以来第一个主要版本:

亮点

  • np.quantile 现在支持 "权重 "参数
  • np.unique_counts / np.unique_values,其中一个相当于 pandas.Series.value_counts(),这将是非常棒的,避免了经常为使用 value_counts 而转换为 Series。
  • 奇怪的是,新增了 np.device 和 np.to_device,但只支持 device='cpu'。也许 numpy 打算成为 Pytorch 的替代品?
  • 添加了 StringDtype。如果你有一个字符串数组,它的 dtype 通常是 "U58",表示它是一个最多 58 个字符的 varchar。现在有了 StringDType,在 np 数组中添加长度可变的字符串似乎变得更容易了。
  • 有了更好的实现,sort 和 argsort 将变得更快。

1、新功能

  • 新的可变长度字符串 dtype(StringDType)和新的 numpy.strings 命名空间,其中包含用于字符串操作的高性能 ufuncs、
  • 在所有 numpy.fft 函数中支持 float32 和 longdouble、
  • 在主 numpy 命名空间中支持数组 API 标准。

2、性能改进:
通过使用英特尔 x86-simd-sort 和 Google Highway 库,排序功能(sort、argsort、partition、argpartition)得到了加速,可能会有较大的(特定于硬件的)提速、

macOS 加速支持和 macOS >=14 的二进制轮子,显著提高了 macOS 上线性代数操作的性能,轮子也缩小了约 3 倍、

通过实施除了支持定长字符串 dtypes 之外还支持 StringDType 的 ufuncs,numpy.char 定长字符串操作已得到加速、

新的跟踪和自省 API opt_func_info,用于确定哪些硬件特定的内核可用并将被调度。

numpy.save 现在使用第 4 版 pickle 协议来保存具有对象 dtype 的数组,这允许 pickle 对象大于 4GB,并将大型数组的保存速度提高了约 5%。


3、Python API 改进:
通过新的模块结构将公共 API 和私有 API 明确分开,现在每个公共函数都可以在一个地方使用、

删除了许多非推荐函数和别名。这将使学习和使用 NumPy 变得更加容易。主命名空间中的对象数量减少了 ~10%,numpy.lib 中的对象数量减少了 ~80%、

规范 dtype 名称和新的 isdtype 自省函数、

4、改进 C API:

  • 新增用于创建自定义 dtypes 的公共 C API、
  • 删除了许多过时的函数和宏,并隐藏了私有内部结构,以方便未来的扩展、
  • 新的、更易于使用的初始化函数:PyArray_ImportNumPyAPI 和 PyUFunc_ImportUFuncAPI。

5、改进的行为:
通过采用 NEP 50,改进了类型推广行为。这修正了许多用户对类型推广的惊奇,以前类型推广通常依赖于输入数组的数据值,而不仅仅是它们的 dtypes。有关详细信息,请参阅 NEP 和 NumPy 2.0 移植指南,因为这一变更可能会导致输出 dtypes 发生变化,并降低混合类型操作的精度。

Windows 上的默认整数类型现在是 int64,而不是 int32,这与其他平台上的行为一致、

数组的最大维数从 32 改为 64


兼容性问题:
NumPy 内部结构也发生了很多变化,包括继续将代码从 C 迁移到 C++,这将使将来改进和维护 NumPy 变得更加容易。

建议所有依赖 NumPy ABI 的下游包针对 NumPy 2.0 构建新版本,并验证该版本是否适用于 2.0 和 1.26 - 最好是在 2.0.0rc1(将是 ABI 稳定的)和最终的 2.0.0 版本之间的时期内,以避免给用户带来问题。


版本稳定性
NumPy 2.0.0是自 2006 年以来第一个主要版本,这是开源库良好管理模式的一个范例。在设计公共应用程序接口时,不应在短时间内对应用程序接口进行破坏性更改,并且应尽量减少需要维护的 LTS 分支。

这可以让工业项目赶上你的大部分功能和文档。数年后,您终于可以重新审视您的传统 API,重新设计它们并将其升级到版本 2,同时还能保持向后兼容性。

SQLAlchemy 是另一个正确构建的库。