用常量替换所有 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)

当存储整数和浮点数时,保留或不保留数据类型可能不会有任何影响,但是,如果还有字符串或布尔变量,结果可能会发生巨大变化。