如何利用xarray数据集实现numpy索引

2024-10-03 09:09:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道2D数组的x和y索引(numpy索引)

在这个documentation之后,xarray使用例如Fortran风格的索引

所以当我通过的时候

ind_x = [1, 2]
ind_y = [3, 4]

我期望索引对(1,3)和(2,4)有2个值,但xarray返回一个2x2矩阵

现在我想知道如何使用xarray实现类似numpy的索引

注意:我希望避免将整个数据加载到内存中。因此,使用.valuesapi不是我正在寻找的解决方案的一部分


Tags: 数据内存numpy风格documentation矩阵数组解决方案
2条回答

您可以访问底层numpy数组以直接为其编制索引:

import xarray as xr

x = xr.tutorial.load_dataset("air_temperature")

ind_x = [1, 2]
ind_y = [3, 4]

print(x.air.data[0, ind_y, ind_x].shape)
# (2,)

编辑:

假设您的数据位于dask支持的xarray中,并且不想将所有数据加载到内存中,则需要在xarray数据对象后面的dask数组上使用vindex

import xarray as xr

# simple chunk to convert to dask array
x = xr.tutorial.load_dataset("air_temperature").chunk({"time":1})

extract = x.air.data.vindex[0, ind_y, ind_x]

print(extract.shape)
# (2,)

print(extract.compute())
# [267.1, 274.1], dtype=float32)

为了考虑速度,我用不同的方法进行了测试

def method_1(file_paths: List[Path], indices) -> List[np.array]:
    data=[]
    for file in file_paths:
        d = Dataset(file, 'r')
        data.append(d.variables['hrv'][indices])
        d.close()
    return data


def method_2(file_paths: List[Path], indices) -> List[np.array]:
    data=[]
    for file in file_paths:
        data.append(xarray.open_dataset(file, engine='h5netcdf').hrv.values[indices])
    return data


def method_3(file_paths: List[Path], indices) -> List[np.array]:
    data=[]
    for file in file_paths:
        data.append(xarray.open_mfdataset([file], engine='h5netcdf').hrv.data.vindex[indices].compute())
    return data
In [1]: len(file_paths)
Out[1]: 4813

结果是:

  • 方法_1(使用netcdf4库):101.9s
  • 方法2(使用xarray和API值):591.4s
  • 方法_3(使用xarray+dask):688.7s

我猜xarray+dask在.compute步中花费了很多时间

相关问题 更多 >