Array
目录
Array¶
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 Array 协调许多 NumPy 数组(或在 API 上足够类似 NumPy 的“鸭子数组”,例如 CuPy 或 Sparse arrays),并将它们排列成网格。这些数组可能存储在磁盘上或位于其他机器上。
新的鸭子数组块类型(在NEP-13 的类型转换层级中低于 Dask 的类型)可以通过 register_chunk_type()
进行注册。任何未注册的其他鸭子数组类型在二元操作和 NumPy ufuncs/函数中将被推迟处理(也就是说,Dask 将返回 NotImplemented
)。但是请注意,使用 from_array()
可以将任何 ndarray-like 类型插入到 Dask Array 中。
常见用途¶
Dask Array 被应用于大气科学、海洋科学、大规模图像处理、基因组学、优化或统计数值算法等领域。
范围¶
Dask Array 支持 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 Array 的效率也非常低。Dask 的开发是由实际需求驱动的,因此许多使用较少的功能尚未实现。欢迎社区贡献。
请参阅dask.array API 以获得更全面的功能列表。
执行¶
默认情况下,Dask Array 使用线程调度器,以避免数据传输成本,并且因为 NumPy 很好地释放了 GIL。在使用 dask.distributed 调度器的集群上也相当有效。