假设我们打开一个 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 有很多维度时。
所以,我想知道是否有任何简单而明确的方法可以做到这一点。 非常感谢。
步骤顺序是合理的(创建新的占位符数组,然后将数据复制到其中),但是我们可以使用原始数组的维度,因此如果新数组的维度和坐标与以下相同,则不必对新数组的维度和坐标进行硬编码原来的。
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