dask.array.reshape_blockwise

dask.array.reshape_blockwise

dask.array.reshape_blockwise(x: dask.array.core.Array, shape: int | tuple[int, ...], chunks: tuple[tuple[int, ...], ...] | None = None) dask.array.core.Array[源代码]

块状重塑为新形状。

Dask 中的常规重塑操作在数组中保留了 C 顺序,这需要对大多数重塑操作进行重新分块,从而使得计算相对昂贵。

块状重塑将每个块重塑为新形状并将结果连接起来。这是一个简单的块状计算,但返回的结果顺序与NumPy不同。这对于后续不依赖顺序的操作是一个很好的解决方案。

参数
x: 数组

要重塑的输入数组。

形状int 或 int 的元组

新形状应与原始形状兼容。如果是一个整数,那么结果将是一个该长度的1-D数组。一个形状维度可以是-1。在这种情况下,该值是从数组的长度和剩余维度推断出来的。

chunks: int 元组, 默认 None

输出数组中每个块的块大小。Dask 会将每个维度中的块扩展为数组中每个块的块的叉积。

如果给出了chunks并且维度的数量减少,则会引发错误。

备注

如果维度数量增加,则需要此信息。在这种情况下,Dask 无法推断输出块。如果维度数量减少,则忽略此关键字。

注释

这是 np.reshape 函数的并行版本,具有以下限制:

  1. 它返回元素的顺序与 NumPy 不同

  2. 它只允许像 (1, 2, 3, 4) -> (1, 6, 4) 这样的重塑操作。

示例

>>> import dask.array as da
>>> import numpy as np
>>> x = da.from_array(np.arange(0, 27).reshape(3, 3, 3), chunks=(3, 2, (2, 1)))
>>> result = reshape_blockwise(x, (3, 9))
>>> result.chunks
((3,), (4, 2, 2, 1))

生成的块是自动计算的,以匹配新的形状。

>>> result.compute()
array([[ 0,  1,  3,  4,  2,  5,  6,  7,  8],
       [ 9, 10, 12, 13, 11, 14, 15, 16, 17],
       [18, 19, 21, 22, 20, 23, 24, 25, 26]])
>>> result = reshape_blockwise(result, (3, 3, 3), chunks=x.chunks)
>>> result.chunks
((3,), (2, 1), (2, 1))

生成的块取自输入。像这样将重塑操作链接在一起会恢复之前减少维数的重塑操作。

>>> result.compute()
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]],

       [[18, 19, 20],
        [21, 22, 23],
        [24, 25, 26]]])