计算数据集中的新变量并将其保存为新尺寸

时间:2018-10-05 09:20:04

标签: python-xarray

我有一个数据集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

我计算了一个新变量“ Heat”,该变量要沿着维度“ Altitude”和沿着新维度“ 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功能,该功能可以帮助我更好地做到这一点?

2 个答案:

答案 0 :(得分:0)

在我看来,您实际上将Var_2Var_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 ...

答案 1 :(得分:0)

借助@delgadom(https://stackoverflow.com/a/52681787/7950930)的答案,我找到了一个令人满意的解决方案,并将其发布在这里。

Link link = new Link(null, new ExternalResource(UriUtil.createAdUri(ad)));
link.setIcon(VaadinIcons.EYE);

有了这个,代码比以前更短,更易于理解。

我也在http://xarray.pydata.org/en/stable/combining.html#concatenate处找到了答案,但我之前听不懂。