[ PROMPT_NODE_26416 ]
arrays
[ SKILL_DOCUMENTATION ]
# Dask 数组
## 概述
Dask 数组使用分块算法实现了 NumPy 的 ndarray 接口。它协调排列成网格的多个 NumPy 数组,以实现对超出可用内存的数据集进行计算,并利用跨多个核心的并行性。
## 核心概念
Dask 数组被划分为多个块(chunks):
- 每个块都是一个常规的 NumPy 数组
- 操作并行应用于每个块
- 结果自动合并
- 支持核外计算(数据大于内存)
## 关键能力
### Dask 数组支持的内容
**数学运算**:
- 算术运算 (+, -, *, /)
- 标量函数(指数、对数、三角函数)
- 逐元素操作
**归约(Reductions)**:
- `sum()`, `mean()`, `std()`, `var()`
- 沿指定轴的归约
- `min()`, `max()`, `argmin()`, `argmax()`
**线性代数**:
- 张量收缩
- 点积和矩阵乘法
- 部分分解(SVD, QR)
**数据操作**:
- 转置
- 切片(标准和花式索引)
- 重塑
- 连接和堆叠
**数组协议**:
- 通用函数 (ufuncs)
- 用于互操作性的 NumPy 协议
## 何时使用 Dask 数组
**在以下情况使用 Dask 数组**:
- 数组超出可用内存
- 计算可以跨块并行化
- 使用 NumPy 风格的数值运算
- 需要将 NumPy 代码扩展到更大的数据集
**在以下情况坚持使用 NumPy**:
- 数组可以轻松放入内存
- 操作需要数据的全局视图
- 使用 Dask 中不可用的专用函数
- 仅使用 NumPy 性能就足够了
## 重要限制
Dask 数组有意不实现某些 NumPy 功能:
**未实现**:
- 大多数 `np.linalg` 函数(仅提供基本操作)
- 难以并行化的操作(如全排序)
- 内存效率低的操作(转换为列表、通过循环迭代)
- 许多专用函数(由社区需求驱动)
**变通方法**:对于不支持的操作,考虑使用 `map_blocks` 配合自定义 NumPy 代码。
## 创建 Dask 数组
### 从 NumPy 数组创建
python
import dask.array as da
import numpy as np
# 使用指定块从 NumPy 数组创建
x = np.arange(10000)
dx = da.from_array(x, chunks=1000) # 创建 10 个块,每个块 1000 个元素
### 随机数组
python
# 使用指定块创建随机数组
x = da.random.random((10000, 10000), chunks=(1000, 1000))
# 其他随机函数
x = da.random.norma