python-xarray:如何创建数据集并将迭代结果分配给数据集?

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

我有一个 for 循环,它对某些数据运行一些分析并返回一些值。由于无聊的原因,这个循环不能轻易地矢量化。我想创建一个数据集,然后在迭代时将 for 循环的结果分配给数据集。

Dataset.update

如果我编写一些使用

Dataset.update
的代码,如下所示:

import numpy as np
from xarray import Dataset, cftime_range, concat

times = cftime_range(start="2024-01-01", end="2024-01-02", freq="H")

test_xarray = Dataset(coords={"time": None, "mlt": np.arange(24)})

for time in times:
    test_for_this_time = Dataset({"x": (["time", "mlt"], np.random.random((1, 24)))},
                                 coords={"time": np.array([time]), "mlt": np.arange(24)})
    test_xarray.update(test_for_this_time)

print(test_xarray)

我得到以下信息:

<xarray.Dataset>
Dimensions:  (time: 1, mlt: 24)
Coordinates:
  * time     (time) object 2024-01-01 00:00:00
  * mlt      (mlt) int64 0 1 2 3 4 5 6 7 8 9 ... 14 15 16 17 18 19 20 21 22 23
Data variables:
    x        (time, mlt) float64 nan nan nan nan nan nan ... nan nan nan nan nan

Dataset.merge

这显然不是我想要的,所以我尝试使用

Dataset.merge
而不是
update

import numpy as np
from xarray import Dataset, cftime_range, concat

times = cftime_range(start="2024-01-01", end="2024-01-02", freq="H")

test_xarray = Dataset(coords={"time": None, "mlt": np.arange(24)})

for time in times:
    test_for_this_time = Dataset({"x": (["time", "mlt"], np.random.random((1, 24)))},
                                 coords={"time": np.array([time]), "mlt": np.arange(24)})
    test_xarray = test_xarray.merge(test_for_this_time)

print(test_xarray)

我得到以下信息:

<xarray.Dataset>
Dimensions:  (time: 25, mlt: 24)
Coordinates:
  * time     (time) object 2024-01-01 00:00:00 ... 2024-01-02 00:00:00
  * mlt      (mlt) int64 0 1 2 3 4 5 6 7 8 9 ... 14 15 16 17 18 19 20 21 22 23
Data variables:
    x        (time, mlt) float64 0.6399 0.6227 0.7972 ... 0.7804 0.8763 0.7198

这确实达到了我想要的效果,所以万岁,但我不明白我在第一种方法中做错了什么,我希望这种方法能起作用。

这是最好的方法吗?

我很好奇我是否在这里以最好的方式使用 xarray 。我浏览了 Stack Overflow 和文档,但没有看到此类工作流程的任何示例。我也尝试过使用

xarray.concat
,但这似乎并没有达到我想要的效果;它在
None
维度中留下第一个
time
值。上面的方法可能是最好的方法,但如果不是,我将非常感谢任何有关如何更好地做到这一点的建议。

python numpy python-xarray
1个回答
0
投票

我认为所提出的

Dataset.update
Dataset.merge
方法并不理想。 没有必要在 for 循环的每次迭代中创建新的数据集,其唯一目的是向现有数据集添加新数据。

在您的示例中,您迭代的坐标在 for 循环之前是已知的。 因此,我的建议是首先创建一个包含正确形状但未填充(或填充虚拟值)的

Dataset
,然后在 for 循环中填充值:
DataArray

这对您的应用可行吗?

© www.soinside.com 2019 - 2024. All rights reserved.