【发布时间】:2021-01-14 06:16:48
【问题描述】:
我不确定是否可行,但我想向 xarray 添加一个新坐标,该坐标与其索引的数据大小相同,但维度数不同。
例如,取一个二维数组,一维是日期,一维是时间:
data = np.random.rand(5, 24)
date_idx = pd.date_range("20200921", "20200925")
time_of_day_idx = np.arange(0, np.timedelta64(1, "D"), np.timedelta64(1, "h"))
da = xr.DataArray(data,
dims=("date", "time_of_day"),
coords={"date" : date_idx,
"time_of_day": time_of_day_idx})
我可以为数组中的每个值添加一个带有时间的新二维坐标。
time_idx = np.add.outer(date_idx, time_of_day_idx)
da.assign_coords(time=(("date", "time_of_day"), time_idx))
但我真正想做的是将维度堆叠在一起,为同一数组中的时间序列创建一个新的一维坐标,如下所示:
da.assign_coords(time=(("date", "time_of_day"), time_idx.flatten()))
但是,这样做会引发:
ValueError: dimensions ('date', 'time_of_day') must have the same length as the number of data dimensions, ndim=1
我知道我可以将 2D xarray 重塑或展平为 1D 并为时间序列创建新索引,但是能够拥有可以索引到 2D xarray 的 1D 坐标会非常方便。我玩过stacking和MultiIndex,但我发现了同样的问题,每个索引都有单独的值访问每个维度,而不是可以用于跨两个维度索引位置的单个值。
有人知道这是否可行吗?
【问题讨论】:
-
你想改变数组的尺寸和坐标吗?或者有一个具有不同尺寸坐标的数组?
-
@Maximilian 理想情况下,我想要一个可以由具有不同维度的坐标索引的数组。在我的示例中,我可以将时间序列存储在二维数组中,一个轴是日期,另一个轴是一天中的时间。我希望能够指定一个称为时间的一维坐标,它可以跨这两个轴进行索引。
-
你所说的“一维坐标……可以跨这两个轴索引”是什么意思?
-
@Maximilan 对不起,我解释得不好。假设我有一个 2D xarray,一个轴是 3 长,另一个是 4 长。我想添加一个 12 长的坐标。这就像 DataArray.stack(),但我想在每个索引处设置一个值,而不是 MultiIndex 在每个索引处有多个值。也许这是可能的另一种方式,例如。通过堆叠创建一个新的 MultiIndex 坐标,然后添加另一个坐标,该坐标具有自己的一组引用该 MultiIndex 坐标的值? xarrays中的坐标可以相互索引,还是只能直接索引数组中的轴?
-
您希望您的最终阵列是什么样的? 3x4 还是 12x1? Xarray 仅允许沿数组中每个维度的索引,因此您不能在 4x3 数组上拥有 12x1 索引。 [续]
标签: pandas numpy python-xarray