首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从数据集中计算新变量并使用新维度保存它们

从数据集中计算新变量并使用新维度保存它们
EN

Stack Overflow用户
提问于 2018-10-05 09:20:04
回答 2查看 944关注 0票数 1

我有一个数据集ds,变量是Var_1,Var_2和Var_3,它们都是物理量,温度,密度和压力。

代码语言:javascript
复制
<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“与两个条目。已经存在的变量不能分配给这个新维度。

代码语言:javascript
复制
<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数据集,我不需要保存这些数据集。

代码语言:javascript
复制
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功能,可以帮助我更好地做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-06 17:50:01

在我看来,从本质上讲,您将Var_2Var_3视为new_dim的切片。你可以沿着这个昏暗的地方把它们连起来:

代码语言:javascript
复制
In [3]: reindexed_2_3 = xr.concat(
   ...:     [ds.Var_2, ds.Var_3],
   ...:     dim=pd.Index(['a', 'b'], name='New_Dim'))
   ...:

这允许您像通常那样对组合数组进行计算:

代码语言:javascript
复制
In [4]: new_var = ds.Var_1 * reindexed_2_3

当然,您可以将其添加回原始数据集中:

代码语言:javascript
复制
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 ...

虽然如果连接对象对其他操作更有帮助,但是您可以创建一个具有以下坐标集的新数据集:

代码语言:javascript
复制
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 ...
票数 0
EN

Stack Overflow用户

发布于 2018-10-08 10:45:00

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

代码语言:javascript
复制
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找到了答案,但我无法更早地理解它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52662329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档