数组

Dask Array 使用分块算法实现了 NumPy ndarray 接口的一个子集,将大数组分割成许多小数组。这使我们能够使用所有核心计算大于内存的数组。我们使用 Dask 图来协调这些分块算法。

示例

访问 http://www.aidoczh.com/dask-examples/ array.html 查看并运行使用 Dask Array 的示例。

设计

Dask 数组协调许多 numpy 数组

Dask 数组协调许多 NumPy 数组(或 API 上足够类似于 NumPy 的“鸭子数组”,如 CuPy 或 Sparse 数组)排列成一个网格。这些数组可能存在于磁盘或其他机器上。

新的鸭子数组块类型(在 NEP-13 的类型转换层次结构 中位于 Dask 之下的类型)可以通过 register_chunk_type() 进行注册。任何其他未注册的鸭子数组类型在二进制操作和 NumPy ufuncs/函数中将被推迟处理(即,Dask 将返回 NotImplemented)。不过请注意,任何 ndarray 类类型都可以使用 from_array() 插入到 Dask 数组中。

常见用途

Dask Array 被用于大气和海洋科学、大规模成像、基因组学、优化或统计的数值算法等领域。

范围

Dask 数组支持大部分的 NumPy 接口,如下所示:

  • 算术和标量数学:+, *, exp, log, ...

  • 沿轴的缩减操作:sum(), mean(), std(), sum(axis=0), ...

  • 张量收缩 / 点积 / 矩阵乘法: tensordot

  • 轴重排序 / 转置: transpose

  • 切片: x[:100, 500:100:-2]

  • 使用列表或 NumPy 数组对单个轴进行花式索引:x[:, [10, 1, 5]]

  • __array____array_ufunc__ 这样的数组协议

  • 一些线性代数:svd, qr, solve, solve_triangular, lstsq

然而,Dask Array 并没有实现 NumPy 接口的全部功能。期待这一点的用户将会感到失望。特别地,Dask Array 缺乏以下功能:

  • np.linalg 的许多功能尚未实现。这一工作由许多优秀的 BLAS/LAPACK 实现完成,并且是众多正在进行学术研究项目的重点。

  • 形状未知的数组不支持所有操作

  • sort 这样的操作在并行处理中是出了名的困难,并且在非常大的数据上其价值有所降低(你很少真正需要完全排序)。通常我们会包含一些并行友好的替代方案,比如 topk

  • Dask Array 没有实现像 tolist 这样的操作,因为对于较大的数据集来说,这些操作会非常低效。同样,使用 for 循环遍历 Dask 数组也是非常低效的。

  • Dask 的开发是由即时需求驱动的,因此许多较少使用的功能尚未实现。鼓励社区贡献。

有关更多功能列表,请参阅 dask.array API

执行

默认情况下,Dask Array 使用线程调度器以避免数据传输成本,并且由于 NumPy 很好地释放了 GIL。在集群上使用 dask.distributed 调度器时也非常有效。