如何解决`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))
然后我尝试执行这个简单的函数:
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 举报,一经查实,本站将立刻删除。