关于xarray open_mfdataset合并netCDF文件后变量未返回Numpy数组的技术咨询
解决xarray合并netCDF后变量为Dask数组的问题
这事儿我之前处理过,其实根源是xarray为了应对大文件场景,默认用Dask延迟加载来处理合并后的变量,而你指定的concat_dim="row"会被直接生成Numpy数组(因为维度信息是合并时直接计算出来的,不需要延迟)。要让所有变量都变成Numpy数组,有两种简单的方法:
方法一:合并后直接加载到内存
如果你的总数据量(96万行)在内存承受范围内,直接在合并后调用load()方法,就能把所有Dask数组转换成Numpy数组:
ds_disk_merged = xarray.open_mfdataset([path1, path2, path3, path4], concat_dim="row", combine='nested').load()
之后再访问ds_disk_merged.time.data,就会得到你想要的Numpy数组了。
方法二:针对单个变量转换(按需加载)
如果不想一次性把所有数据加载到内存,也可以对特定变量单独用compute()或者直接取.values来触发计算,得到Numpy数组:
# 两种方式效果一致 time_numpy = ds_disk_merged.time.compute() time_numpy = ds_disk_merged.time.values
补充说明
为什么row维度一开始就是Numpy数组?因为xarray在执行concat_dim合并时,会直接计算出拼接后的维度索引,不需要延迟加载;而其他变量的数据默认会保留Dask的分块结构(对应你每个输入文件的行数),这样可以避免一次性加载大文件导致内存溢出。既然你的数据量不大,第一种方法最适合你的需求。
内容的提问来源于stack exchange,提问作者Greg Madman
相关产品推荐
相关产品推荐

