向 Array Dataarray 中的一个现有坐标添加一些值

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

假设我们打开一个 NetCDF 文件并获取一个 DataArray

da
就像

<xarray.DataArray (x: 2, y: 3)>
array([[0.50793919, 0.49505336, 0.19573345],
       [0.7830897 , 0.82954952, 0.19427877]])
Coordinates:
  * x        (x) int64 0 1
  * y        (y) int64 0 1 2

现在,我们的目标 DataArray

da_new
看起来像

<xarray.DataArray (x: 4, y: 3)>
array([[0.50793919, 0.49505336, 0.19573345],
       [0.7830897 , 0.82954952, 0.19427877],
       [       nan,        nan,        nan],
       [       nan,        nan,        nan]])
Coordinates:
  * x        (x) int64 0 1 2 3
  * y        (y) int64 0 1 2

为了达到我们的目标,我们可以构造一个新的 DataArray 并使用

da
数据重新填充它,类似于

da_new = xr.DataArray(
    data = np.full([4,3], fill_value=np.nan),
    dims = ['x','y'],
    coords=dict(
        x = range(4),
        y = range(3)
    )
)
da_new.loc[0:1,:] = da

但是,在我这边,这个方法有点累,尤其是当 DataArray 有很多维度时。

所以,我想知道是否有任何简单而明确的方法可以做到这一点。 非常感谢。

python python-xarray
1个回答
0
投票

步骤顺序是合理的(创建新的占位符数组,然后将数据复制到其中),但是我们可以使用原始数组的维度,因此如果新数组的维度和坐标与以下相同,则不必对新数组的维度和坐标进行硬编码原来的。

制作一些数据

import numpy as np
import xarray as xr

# Toy data.
ar = np.array([
    [0.50793919, 0.49505336, 0.19573345],
    [0.7830897 , 0.82954952, 0.19427877]])
da = xr.DataArray(
    data = ar,
    dims = ['x','y'],
    coords=dict(
        x = range(2),
        y = range(3)
    ))
da
# array([[0.50793919, 0.49505336, 0.19573345],
#       [0.7830897 , 0.82954952, 0.19427877]])
# Coordinates:
#    x   (x) int64 0 1
#    y   (y) int64 0 1 2

制作更大的占位符数组

# Map some dimensions to new coordinates of any length.
new_coords = dict(x=range(4))

# Make empty placeholder array, replacing some coordinates with new ones.
da_bigger = xr.DataArray(
    dims=da.dims,
    coords=dict(da.coords, **new_coords))

da_bigger

# array([[nan, nan, nan],
#        [nan, nan, nan],
#        [nan, nan, nan],
#        [nan, nan, nan]])
# Coordinates:
#    x  (x) int64 0 1 2 3
#    y  (y) int64 0 1 2

复制数据

# Copy data from original into corresponding coordinates of bigger array.
da_bigger.loc[{k: da[k] for k in new_coords}] = da

da_bigger

# array([[0.50793919, 0.49505336, 0.19573345],
#        [0.7830897 , 0.82954952, 0.19427877],
#        [       nan,        nan,        nan],
#        [       nan,        nan,        nan]])
# Coordinates:
#     x   (x) int64 0 1 2 3
#     y   (y) int64 0 1 2

假设:新坐标是原始坐标的超集。

编辑:使用
xr.align

我们可以让

xr.align
来完成复制操作的繁重工作。在此示例中,空占位符数组直接传递到
align
中,而不将其存储在命名变量中。

da_big2, _ = xr.align(
    da,
    xr.DataArray(
        dims=da.dims,
        coords=dict(da.coords, **new_coords)),
    join="outer")
da_big2
# array([[0.50793919, 0.49505336, 0.19573345],
#        [0.7830897 , 0.82954952, 0.19427877],
#        [       nan,        nan,        nan],
#        [       nan,        nan,        nan]])
# Coordinates:
#     x   (x) int64 0 1 2 3
#     y   (y) int64 0 1 2
© www.soinside.com 2019 - 2024. All rights reserved.