尺寸更改的map_blocks返回IndexError:元组索引超出范围

时间:2019-07-07 15:51:58

标签: python dask

我正在尝试使用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

1 个答案:

答案 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)

此外,对于这些东西,直到它们解决为止,处理小数据是有意义的,这是我在上面的示例中添加的。