我有一个(大型)多维xarray数据数组或数据集,并希望沿1D路径选择或内插数据,而不会降低循环或列表理解的速度(例如,在“纬度和经度”上定义了2D数据,我想沿经度和纬度指定的路径获取数据):
import xarray as xr
import numpy as np
lats, lons = np.arange(0, 6), np.arange(10, 17)
path_lats, path_lons = np.arange(0.3, 5, 0.5), np.arange(10.6, 15.6, 0.5)
da = xr.DataArray(np.random.rand(len(lats), len(lons)), coords=[lats, lons], dims=['latitude', 'longitude'])
以下代码返回一个包含path_lats和path_lons所有组合的2D DataArray,类似于使用itertools.product(path_lats,path_lons)的for循环:
da_path = da.interp(latitude=path_lats, longitude=path_lons)
对于二维以上的大型Dataarrays \ Dataset,这将消耗大量内存,因为它包含了此任务不需要的大量数据。
我想要的是使用zip(path_lats,path_lons)的for loop \ list理解的快速版本,例如类似于(此处无效的语法)
da_pathZIP = da.interp((latitude, longitude) = (path_lats, path_lons))
,它将返回一维数据数组(坐标:路径的索引),以及可能会附加到数据的纬度和经度。生成的Datarray应该包含以下数据:
[float(da.interp(latitude=p_lat, longitude=p_lon)) for p_lat, p_lon in zip(path_lats, path_lons)]
在不使用循环的情况下,是否可以在xarray中使用?
答案 0 :(得分:2)
没关系,我只是在xarray docs中找到了解决方案:
da_lons = xr.DataArray(path_lons, dims='time')
da_lats = xr.DataArray(path_lats, dims='time')
da_pathZIP = da.interp(latitude=da_lats, longitude=da_lons)