正确选择 dask 数组的块规范

Correct choice of chunks-specification for dask array

根据 dask documentaion 可以通过以下三种方式之一指定块:

  • a blocksize like 1000
  • a blockshape like (1000, 1000)
  • explicit sizes of all blocks along all dimensions, like ((1000, 1000, 500), (400, 400))

Your chunks input will be normalized and stored in the third and most explicit form..

在尝试使用 visualize() 函数了解块的工作方式后,仍有一些我不确定的事情:

如果输入是归一化的,我选择哪种输入形式有关系吗?

Blocksize 表示每个块的大小为 X,即 1000。blockshape 输入指定什么?

当给出一个 blockshape 输入时,参数的顺序有区别吗?它与array/matrix的形状有什么关系?

该列表中较低的形式更明确,并且允许块形状中更大的不对称性。

例子

我们将通过以下数组中 chunks 的一系列示例来讨论这个问题:

1 2 3 4 5 6
7 8 9 0 1 2
3 4 5 6 7 8
9 0 1 2 3 4 
5 6 7 8 9 0 
1 2 3 4 5 6

我们展示了不同的 chunks 参数如何将数组分成不同的块

chunks=3

大小为 3 的对称块

1 2 3  4 5 6
7 8 9  0 1 2
3 4 5  6 7 8

9 0 1  2 3 4 
5 6 7  8 9 0 
1 2 3  4 5 6

chunks=2

大小为 2 的对称块

1 2  3 4  5 6
7 8  9 0  1 2

3 4  5 6  7 8
9 0  1 2  3 4 

5 6  7 8  9 0 
1 2  3 4  5 6

chunks=(3, 2)

大小为 (3, 2)

的不对称但重复的块
1 2  3 4  5 6
7 8  9 0  1 2
3 4  5 6  7 8

9 0  1 2  3 4 
5 6  7 8  9 0 
1 2  3 4  5 6

chunks=(1, 6)

大小为 (1, 6)

的不对称但重复的块
1 2 3 4 5 6

7 8 9 0 1 2

3 4 5 6 7 8

9 0 1 2 3 4 

5 6 7 8 9 0 

1 2 3 4 5 6

chunks=((2, 4), (3, 3))

不对称和 non-repeated 块

1 2 3  4 5 6
7 8 9  0 1 2

3 4 5  6 7 8
9 0 1  2 3 4 
5 6 7  8 9 0 
1 2 3  4 5 6

chunks=((2, 2, 1, 1), (3, 2, 1))

不对称和 non-repeated 块

1 2 3  4 5  6
7 8 9  0 1  2

3 4 5  6 7  8
9 0 1  2 3  4 

5 6 7  8 9  0 

1 2 3  4 5  6

讨论

后面的例子很少由用户在原始数据上提供,而是来自复杂的切片和广播操作。通常我使用最简单的形式,直到我需要更复杂的形式。块的选择应与您要进行的计算保持一致。

例如,如果您打算沿第一个维度取出薄片,那么您可能希望使该维度比其他维度更细。如果您打算学习线性代数,那么您可能需要更多对称块。