我有一个数据集ds,变量是Var_1,Var_2和Var_3,它们都是物理量,温度,密度和压力。
<xarray.Dataset>
Dimensions: (Altitude: 100)
Coordinates:
* Altitude (Altitude) float64
Data variables:
Var_1 (Altitude) float64
Var_2 (Altitude) float64
Var_3 (Altitude) float64我计算一个新的变量“热”,我想添加到我的数据集沿维度“高度”和一个新的维度"Energy_Type“与两个条目。已经存在的变量不能分配给这个新维度。
<xarray.Dataset>
Dimensions: (Altitude: 100, Energy_Type: 2 )
Coordinates:
* Altitude (Altitude) float64
* New_Dim (Energy_Type) object 'Sensible' 'Latent'
Data variables:
Var_1 (Altitude) float64
Var_2 (Altitude) float64
Var_3 (Altitude) float64
Heat (Altitude, Energy_Type) float64我还在计算中使用了另外两个xarray数据集,我不需要保存这些数据集。
sensible = xr.Dataset()
sensible['Heat'] = ds.Var_1 * Dataset_X * ds.Var_2
sensible.coords['Energy_Type'] = "Sensible"
sensible = sensible.expand_dims('Energy_Type')
latent = xr.Dataset()
latent['Heat'] = ds.Var_1 * Dataset_Y * ds.Var_3
latent.coords['Energy_Type'] = "Latent"
latent = latent.expand_dims('Energy_Type')
ds = xr.merge([ds, sensible, latent])虽然这很有效,但对我来说并不是最好的方法。我是不是缺少了一个简单的xarray功能,可以帮助我更好地做到这一点?
发布于 2018-10-06 17:50:01
在我看来,从本质上讲,您将Var_2和Var_3视为new_dim的切片。你可以沿着这个昏暗的地方把它们连起来:
In [3]: reindexed_2_3 = xr.concat(
...: [ds.Var_2, ds.Var_3],
...: dim=pd.Index(['a', 'b'], name='New_Dim'))
...:这允许您像通常那样对组合数组进行计算:
In [4]: new_var = ds.Var_1 * reindexed_2_3当然,您可以将其添加回原始数据集中:
In [5]: ds['New_Var'] = new_var
In [6]: ds
Out[6]:
<xarray.Dataset>
Dimensions: (Altitude: 100, New_Dim: 2)
Coordinates:
* Altitude (Altitude) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
* New_Dim (New_Dim) object 'a' 'b'
Data variables:
Var_1 (Altitude) float64 0.4059 0.4675 0.28 0.7884 0.523 0.6433 ...
Var_2 (Altitude) float64 0.7325 0.4088 0.7504 0.2138 0.8064 0.4313 ...
Var_3 (Altitude) float64 0.5138 0.6193 0.5576 0.6782 0.9428 0.7201 ...
New_Var (Altitude, New_Dim) float64 0.2973 0.2086 0.1911 0.2895 0.2101 ...虽然如果连接对象对其他操作更有帮助,但是您可以创建一个具有以下坐标集的新数据集:
In [7]: xr.Dataset({'reindexed_2_3': reindexed_2_3, 'new_var': new_var})
Out[7]:
<xarray.Dataset>
Dimensions: (Altitude: 100, New_Dim: 2)
Coordinates:
* Altitude (Altitude) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
* New_Dim (New_Dim) object 'a' 'b'
Data variables:
reindexed_2_3 (New_Dim, Altitude) float64 0.7325 0.4088 0.7504 0.2138 ...
new_var (Altitude, New_Dim) float64 0.2973 0.2086 0.1911 0.2895 ...发布于 2018-10-08 10:45:00
在@delgadom (https://stackoverflow.com/a/52681787/7950930)回答的帮助下,我找到了一个令人满意的解决方案,并将在这里发布。
sensible = ds.Var_1 * Dataset_X * ds.Var_2
latent = ds.Var_1 * Dataset_Y * ds.Var_3
Heat = xr.concat(
[sensible, latent],
dim=pd.Index(['sensible','latent'],name='Energy_type'))
ds['Heat'] = Heat这样,代码就比以前更短、更容易理解了。
我也在http://xarray.pydata.org/en/stable/combining.html#concatenate找到了答案,但我无法更早地理解它。
https://stackoverflow.com/questions/52662329
复制相似问题