我想用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)
答案 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()