如何直接迭代或访问xarray块?需保留坐标与维度信息
寻找迭代Xarray块的方法(带坐标维度信息)
我需要一种能迭代Xarray块的方法,类似dask.array.blocks,但要能直接访问带坐标和维度信息的Xarray块。
- 我知道
xarray.map_blocks的存在,但我的场景需要将输入块映射为形状未知的输出块,所以得通过直接循环Xarray块来实现自定义逻辑。 - 我曾尝试查看
xarray.map_blocks的源码,推测里面有类似的实现逻辑,但没搞懂具体运作机制。
实际场景补充
针对每个Xarray输入块,生成一个新维度(命名为foo)长度可变的输出Xarray块,最终沿foo维度拼接所有输出块。
以下是模拟场景代码,当前我通过从DataArray的每个dask块手动构建Xarray块(实现方式繁琐),再用client.map(fn_on_chunk, xarray_chunks)解决了问题:
n = 1000 x_raster = y_raster = np.arange(n) time = np.arange(10) vals_raster = np.arange(n*n*10).reshape(n, n, 10) da_raster = xr.DataArray(vals_raster, coords={"y": y_raster, "x": x_raster, 'time':time}) da_raster = da_raster.chunk(dict(x=100, y=100)) def fn_on_chunk(da_chunk): # 模拟无法提前预知输出某一维度长度的情况 len_range = np.random.randint(10) outs = [] for foo in range(len_range): # 模拟针对当前块执行逻辑,找到所需坐标 x_chunk, y_chunk = fn_magic(foo) out = da_chunk.sel(x=x_chunk, y=y_chunk) out['foo'] = foo outs.append(out) return xr.concat(outs, dim='foo')
内容的提问来源于stack exchange,提问作者duff18
相关产品推荐
相关产品推荐

