用常量替换所有 xarray 数据集值
Replace all xarray dataset values with a constant
我有一个 xarray 数据集。我想制作一份副本,使其与原件具有相同的 dimensions/coordinates/shape。这很简单。
import xarray as xr
n_segs = 4
n_dates = 5
num_vars = 4
dims = (n_segs, n_dates)
das = [xr.DataArray(np.random.rand(*dims), dims=['seg_id', 'date'])
for i in range(num_vars)]
ds_orig = xr.Dataset({'a': das[0], 'b': das[1], 'c': das[2], 'd': das[3]})
ds_copy = ds_orig.copy(deep=True)
然后我想为副本中的所有值分配一个常量值(假设为 1)。我已经想出如何使用 where
:
ds_copy.where(ds_copy == np.nan, other=1)
但这假设我的值中的 none 将是 nan
,这在我看来有点违反直觉。有没有更稳健的方法?
我想我也可以遍历数据变量(这是 对 Pandas 的建议)...:[=17=]
for v in ds_copy.data_vars:
ds_copy[v].loc[:, :] = 1
也许我在这里寻找的是 replace
方法。
我会推荐循环方法,因为它会保留原始值的数据类型。 loc
中只有一个省略号即可,.data_vars
可以省略(数据集有一个dictionary interface):
for v in ds_copy:
ds_copy[v].loc[:] = 1
要获得更强大的 where
版本,您可以直接传递 False
以确保始终使用 other
:
ds_copy.where(False, 1)
当存储整数和浮点数时,保留或不保留数据类型可能不会有任何影响,但是,如果还有字符串或布尔变量,结果可能会发生巨大变化。
我有一个 xarray 数据集。我想制作一份副本,使其与原件具有相同的 dimensions/coordinates/shape。这很简单。
import xarray as xr
n_segs = 4
n_dates = 5
num_vars = 4
dims = (n_segs, n_dates)
das = [xr.DataArray(np.random.rand(*dims), dims=['seg_id', 'date'])
for i in range(num_vars)]
ds_orig = xr.Dataset({'a': das[0], 'b': das[1], 'c': das[2], 'd': das[3]})
ds_copy = ds_orig.copy(deep=True)
然后我想为副本中的所有值分配一个常量值(假设为 1)。我已经想出如何使用 where
:
ds_copy.where(ds_copy == np.nan, other=1)
但这假设我的值中的 none 将是 nan
,这在我看来有点违反直觉。有没有更稳健的方法?
我想我也可以遍历数据变量(这是 也许我在这里寻找的是 for v in ds_copy.data_vars:
ds_copy[v].loc[:, :] = 1
replace
方法。
我会推荐循环方法,因为它会保留原始值的数据类型。 loc
中只有一个省略号即可,.data_vars
可以省略(数据集有一个dictionary interface):
for v in ds_copy:
ds_copy[v].loc[:] = 1
要获得更强大的 where
版本,您可以直接传递 False
以确保始终使用 other
:
ds_copy.where(False, 1)
当存储整数和浮点数时,保留或不保留数据类型可能不会有任何影响,但是,如果还有字符串或布尔变量,结果可能会发生巨大变化。