首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Dask.Array.From_Zarr打开Dask上的zarr文件?

如何使用Dask.Array.From_Zarr打开Dask上的zarr文件?
EN

Stack Overflow用户
提问于 2022-06-22 07:32:15
回答 2查看 216关注 0票数 2

当将zarr文件转换为dask数组时,我遇到了相当大的问题。这就是当我输入arr = da.from_zarr('gros.zarr/time')时得到的结果:

但是,当我尝试一个坐标,如时间,它是有效的:

有什么办法解决这个问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-22 16:41:09

在xarray中读取zarr数组时,默认情况下将启用dask,除非指定chunks=None。您绝对不必通过dask.dataframe --您可以直接从xarray.DataArraydask.Array。实际上,甚至不需要一个副本--您所需要做的就是访问DataArray的底层DataArray属性。

下面是我在一个文件中的一个例子:

代码语言:javascript
复制
In [3]: import xarray as xr
   ...: import os
   ...:
   ...: fp = os.path.join(
   ...:     ROOT_DIR,
   ...:     'ScenarioMIP/INM/INM-CM5-0/ssp370/r1i1p1f1/day/tasmax/v1.1.zarr'
   ...: )
   ...: 
   ...: ds = xr.open_zarr(fp)
   ...: ds
Out[3]:
<xarray.Dataset>
Dimensions:  (lat: 720, lon: 1440, time: 31390)
Coordinates:
  * lat      (lat) float64 -89.88 -89.62 -89.38 -89.12 ... 89.38 89.62 89.88
  * lon      (lon) float64 -179.9 -179.6 -179.4 -179.1 ... 179.4 179.6 179.9
  * time     (time) object 2015-01-01 12:00:00 ... 2100-12-31 12:00:00
Data variables:
    tasmax   (time, lat, lon) float32 dask.array<chunksize=(365, 360, 360), meta=np.ndarray>
Attributes: (12/47)
    Conventions:                  CF-1.7 CMIP-6.2
    activity_id:                  ScenarioMIP AerChemMIP
    contact:                      climatesci@rhg.com
    creation_date:                2019-06-17T08:27:21Z
    data_specs_version:           01.00.29
    dc6_bias_correction_method:   Quantile Delta Method (QDM)
    ...                           ...
    sub_experiment_id:            none
    table_id:                     day
    tracking_id:                  hdl:21.14100/da7e759e-3979-42e4-b92f-02e7e2...
    variable_id:                  tasmax
    variant_label:                r1i1p1f1
    version_id:                   v20190618

您可以将xarray Dataset看作是将DataArrays作为对象的高级字典。DataArray本身就是带有标记索引的N维数组.DataArray中包含的数据由一个数组“后端”提供,该数组通常是numpy或dask.Array。当您阅读一个zarr数据集时,结果将是一个带有一些额外的xarray索引&元数据处理的dask.Array。通过检查顶部的数组预览,我们可以看到这个数组中的值是一个dask数组:

代码语言:javascript
复制
In [4]: ds.tasmax
Out[4]:
<xarray.DataArray 'tasmax' (time: 31390, lat: 720, lon: 1440)>
dask.array<open_dataset-51b28ad08603ab401a85808d9fa3d6d7tasmax, shape=(31390, 720, 1440), dtype=float32, chunksize=(365, 360, 360), chunktype=numpy.ndarray>
Coordinates:
  * lat      (lat) float64 -89.88 -89.62 -89.38 -89.12 ... 89.38 89.62 89.88
  * lon      (lon) float64 -179.9 -179.6 -179.4 -179.1 ... 179.4 179.6 179.9
  * time     (time) object 2015-01-01 12:00:00 ... 2100-12-31 12:00:00
Attributes:
    cell_measures:  area: areacella
    cell_methods:   area: mean time: maximum (interval: 1 day)
    comment:        maximum near-surface (usually, 2 meter) air temperature (...
    coordinates:    height
    history:        2019-06-17T08:27:21Z altered by CMOR: Treated scalar dime...
    long_name:      Daily Maximum Near-Surface Air Temperature
    original_name:  tasmax
    standard_name:  air_temperature
    units:          K

Xarray是一个很好的库,它允许您在N维空间中使用熊猫风格的索引。但是,如果您想直接使用dask.array,您可以简单地访问dask支持的xarray DataArray上的.data属性:

代码语言:javascript
复制
In [5]: ds.tasmax.data
Out[5]: dask.array<open_dataset-51b28ad08603ab401a85808d9fa3d6d7tasmax, shape=(31390, 720, 1440), dtype=float32, chunksize=(365, 360, 360), chunktype=numpy.ndarray>
票数 1
EN

Stack Overflow用户

发布于 2022-06-22 09:08:32

正如@Michael在评论中指出的那样,如果xarray有效,那么这可能是最好的选择。

但是,如果出于某些原因,您确实希望用dask.array打开它,那么可以使用component kwarg指定感兴趣的组件:

代码语言:javascript
复制
from dask.array import from_zarr

x = from_zarr("gros.zarr", component="time")

有关一些可重复的示例,请参见这篇博客文章

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72711348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档