在dask数组上并行化numpy arange

时间:2018-03-31 15:00:51

标签: python numpy dask

我想用dask做以下操作;假设我有一个numpy数组:
In: x = np.arange(5)
Out: [0,1,2,3,4]
然后我想要一个函数将np.arange映射到我的数组的所有元素。 我已经为此目的定义了一个函数:

def list_range(array, no_cell):
    return np.add.outer(array, np.arange(no_cell)).T

# e.g
In: list_range(x,3)
Out: array([[0, 1, 2, 3, 4],
       [1, 2, 3, 4, 5],
       [2, 3, 4, 5, 6]])

现在我想在 dask 数组上使用map_blocks并行重现这个,但我总是收到错误。以下是基于map_blocks dask documentation的尝试:

constant = 4
d = da.arange(5, chunks=(2,))
f = da.core.map_blocks(list_range, d, constant, chunks=(2,))
f.compute()

我明白了 ValueError: could not broadcast input array from shape (4,2) into shape (4)

1 个答案:

答案 0 :(得分:1)

您是否查看了Dask的ufunc方法?对于您的问题,您可以尝试,

da.add.outer(d, np.arange(constant)).T.compute()

使用map_blocks时,您必须确保在操作导致块尺寸发生变化时指定新尺寸。在您的问题中,块大小不再是(2,),而是(2,4)。应使用new_axis参数指定此新维度。另外,我发现map_blocks并没有在map_blocks之后对块进行vstacking,我也无法在映射函数中使用转置。试试这个让map_blocks工作,

def list_range(array, no_cell):
    return np.add.outer(array, np.arange(no_cell))

constant = 4
d = da.arange(5, chunks=(2,))


f=da.core.map_blocks(list_range, d, constant, chunks=(2,constant), new_axis=[1])
f.T.compute()