我正在尝试使用dask
数组创建汇总统计信息。 map_blocks
似乎很理想,但无法正常工作。
我是dask
的新手,因此尝试了解它的工作方式。我计划使用自定义功能,并从一些基础知识入手。经过数小时的反复试验,我陷入困境,看不到解决方案。
import dask
import dask.array as da
from numpy import median,array
def func(a):
m = median(a)
print(m)
return array(m)
x = da.random.random((10000, 10000), chunks=(5000, 5000))
x.map_blocks(func,chunks=(1,1)).compute()
我希望每个结果块都有一个新数组,但得到:
nan
0.5001597269075302
0.49996143572562185
0.49994227403711916
0.5001512434686584
Traceback (most recent call last):
...
result.append(tuple([shape(deepfirst(a))[dim] for a in arrays]))
IndexError: tuple index out of range
答案 0 :(得分:0)
map_blocks
最初可能会有些棘手。这里的问题是func
返回形状为()
的数组,而在map_blocks
中则指示(1,1)
的输出块。
如果我对您的理解是正确的,则希望将x
的每个块替换为其中位数(这些块将是大小为(1,1)
的新块)。为此,您需要输出具有该形状的数组。请参见以下代码:
import dask
import dask.array as da
from numpy import median,array
def func(a):
m = median(a)
print(m)
return array(m)[None,None] # add dummy dimensions
# x = da.random.random((10000, 10000), chunks=(5000, 5000))
x = da.random.random((100, 100), chunks=(50, 50)) # try things out on small array
x.map_blocks(func,chunks=(1,1)).compute()
使用None
索引数组会为其添加一个虚拟维。因此,array(m)[None,None]
将具有所需的形状(1,1)
。
此外,对于这些东西,直到它们解决为止,处理小数据是有意义的,这是我在上面的示例中添加的。