我怀疑如果您的函数返回与其消耗的维度相同的数组,您的体验会更顺畅。例如。您可以考虑按如下方式定义您的函数:
def my_polyfit(data):
return np.polyfit(data.squeeze(), ...)[:, None, None, None]
那么你可能可以忽略new_axis
, drop_axis
bits.
从性能角度来看,您可能还需要考虑使用更大的块大小。如果每个块有 6000 个数字,您就有超过一百万个块,这意味着您可能会在调度上花费比实际计算更多的时间。一般来说,我会拍摄几兆字节大小的块。当然,增加块大小会导致映射函数变得更加复杂。
Example
In [1]: import dask.array as da
In [2]: import numpy as np
In [3]: def f(b):
return np.polyfit(b.squeeze(), np.arange(5), 3)[:, None, None, None]
...:
In [4]: x = da.random.random((5, 3, 3, 3), chunks=(5, 1, 1, 1))
In [5]: x.map_blocks(f, chunks=(4, 1, 1, 1)).compute()
Out[5]:
array([[[[ -1.29058580e+02, 2.21410738e+02, 1.00721521e+01],
[ -2.22469851e+02, -9.14889627e+01, -2.86405832e+02],
[ 1.40415805e+02, 3.58726232e+02, 6.47166710e+02]],
...