数组

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

示例

Dask Array 应用广泛——凡是处理大型数组数据集的场景都可以使用它。

此示例 使用 Xarray、Dask 和 Coiled 分析国家水文模型 使用 Xarray 和 Dask Array 在集群上处理 6 TB 的地理空间数据。此示例中的集群使用 Coiled 进行部署,但有许多用于管理和部署 Dask 的选项。请参阅我们的 部署 Dask 集群 文档,了解有关部署选项的更多信息。

您还可以访问 https://examples.dask.org.cn/array.html 查看更多示例集合。

设计

Dask arrays coordinate many numpy arrays

Dask 数组协调许多 NumPy 数组(或在 API 上足够类似 NumPy 的“鸭子数组”,例如 CuPy 或稀疏数组),并将它们排列成网格。这些数组可能位于磁盘上或在其他机器上。

新的鸭子数组块类型(在 NEP-13 类型转换层次结构 中位于 Dask 下方的类型)可以通过 register_chunk_type() 注册。任何其他未注册的鸭子数组类型将在二元操作和 NumPy ufuncs/函数中被延迟处理(也就是说,Dask 将返回 NotImplemented)。然而,请注意,任何 ndarray-like 类型都可以使用 from_array() 插入到 Dask Array 中。

常见用途

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 调度器的集群上,它也非常有效。