在 xarray 数据集的子集中设置新值

问题描述 投票:0回答:1

我有一个xarray数据集,涵盖经度从9到30和54到66。如何将该数据集中的所有变量从特定坐标范围设置为-1?

一旦我执行 df.isel 或 df.iloc 或 df.sel 或 df.loc,我就会得到一个数据子集,它比原始数据集小得多。我想获得原始分辨率的数据集。

一些小例子:

#!/usr/bin/env ipython
import xarray as xr
import numpy as np
# --------------------------
xvals = np.arange(9,30,1);nx = np.size(xvals);
yvals = np.arange(53,66,0.5);ny = np.size(yvals);
# -----------------------------------------------
data_a = np.random.random((ny,nx));
data_b = np.random.random((ny,nx));
somedata = xr.Dataset(data_vars={'data_a':(('latc','lonc'),data_a),'data_b':(('latc','lonc'),data_b)},coords={'lonc':('lonc',xvals),'latc':('latc',yvals)})
# -----------------------------------------------
# How to set all data variables in somedata at coordinate range lonc = 15-20 and latc=59-61 to -1e0 using xarray?

我可以轻松使用 NumPy:

# -----------------------------------------------
# NumPy:
xm, ym = np.meshgrid(xvals,yvals);
kk = np.where((xm>15) & (ym>59) & (xm<20) &(ym<61))
data_a[kk] = -1.e0;
data_b[kk] = -1.e0;
somedata['data_a'][:] = data_a;
somedata['data_b'][:] = data_b;
somedata.to_netcdf('test.nc')
# -----------------------------------------------

但也许还有一种很好的方法,使用 xarray 来处理所有变量?

python python-xarray netcdf
1个回答
0
投票

您有几个选择。如果您想要包含替换数据的副本,您可以使用

xr.where
或数据集本身的
where
方法:

newdata = somedata.where((somedata.lonc > 15) & (somedata.lonc < 20) & (somedata.latc > 59) & (somedata.latc < 61), -1.0)

或者如果你想就地做,可以直接通过

.loc
设置数据(使用
np.s_
让切片更干净):

somedata.loc[{'lonc': np.s_[15:20], 'latc': np.s_[59:61]}] = -1.0
© www.soinside.com 2019 - 2024. All rights reserved.