微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

`map_blocks` 导致 Dask 中的元组索引错误

如何解决`map_blocks` 导致 Dask 中的元组索引错误

我试图在数据立方体上并行应用一个简单的操作,但我一直遇到 TypeError

这是我的输入数据立方体(称为 dcube):

<xarray.DataArray 'A' (time: 6,pol: 1,y: 823,x: 1296)>
dask.array<where,shape=(6,1,823,1296),dtype=float64,chunksize=(6,1000),chunktype=numpy.ndarray>
Coordinates:
  * pol      (pol) object 'HH'
  * y        (y) float64 3.653e+06 3.653e+06 3.653e+06 ... 3.652e+06 3.652e+06
  * x        (x) float64 1.047e+06 1.047e+06 1.047e+06 ... 1.049e+06 1.049e+06
  * time     (time) datetime64[ns] 2020-11-05T06:44:35 ... 2020-12-08T16:42:42
    id       (time) <U51 dask.array<chunksize=(6,),Meta=np.ndarray>
Attributes:
    orbit:       A
    transform:   (1.1987408006010196,0.0,1047472.9120438152,-1.198740...
    crs:         {'proj': 'utm','zone': 10,'datum': 'wgs84','units': 'm',...

我试图计算的函数如下所示:

def compute_something(chunk):
    img1 = chunk[0] + 0.00001
    img2 = chunk[1] + 0.00001
    return da.log10(img1 / img2)

当我尝试跑步时:

da.map_blocks(compute_something,dcube,dtype=np.float32).compute()

这是我看到的错误

/usr/local/lib/python3.7/site-packages/tornado/gen.py in run(self)
    760 
    761                     try:
--> 762                         value = future.result()
    763                     except Exception:
    764                         exc_info = sys.exc_info()

/usr/local/lib/python3.7/site-packages/distributed/client.py in _gather(self,futures,errors,direct,local_worker)
   1848                             exc = CancelledError(key)
   1849                         else:
-> 1850                             raise exception.with_traceback(traceback)
   1851                         raise exc
   1852                     if errors == "skip":

TypeError: tuple indices must be integers or slices,not tuple

回溯中似乎没有任何内容表明错误是什么。

为了更深入地理解这个问题,我创建了这个最小的例子:

arr = da.from_array(xa.DataArray([np.random.random((200,200))]),(1,10,10))

xarray

然后我尝试执行这个简单的函数

def fn(x):
   return x

当我尝试使用 map_blocks 进行分发时,出现断言错误

AA = da.map_blocks(fn,arr).compute()
/usr/local/lib/python3.7/site-packages/dask/array/core.py in new_da_object(dsk,name,chunks,Meta,dtype)
   5017         from ..dataframe.core import new_dd_object
   5018 
-> 5019         assert all(len(c) == 1 for c in chunks[1:])
   5020         divisions = [None] * (len(chunks[0]) + 1)
   5021         return new_dd_object(dsk,divisions)

AssertionError: 

这让我觉得我可能缺乏对 map_blocks 工作原理的理解。任何帮助将不胜感激。


更新/编辑:

经过更多调查后,我发现如果块类型为 ndarray,一切都可以完美运行,但如果块类型为 xarray,则它不会。不知道为什么会这样,如何相互转换;但如果我将 arr 初始化为:

arr = da.from_array(np.random.random((200,200)))

map_blocks 完美运行。但是如果它包含一个 xarray 它就没有

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。