【问题标题】:xarray Hierarchical data organizationxarray 分层数据组织
【发布时间】:2018-12-20 02:38:01
【问题描述】:

我有一个脚本,可以计算由于特定电流分布而导致的空间区域中的磁场。此计算的结果存储在具有坐标的 xarray 中:vec_compxyzvec_comp 跨越字符串['x', 'y', 'z'] 以指示磁场的不同分量。

我正在为许多不同的电流配置计算这个磁场(例如,具有不同半径和距感兴趣区域距离的电流回路)。我想将这些磁场对象(xarray)收集到另一个 xarray 中,该 xarray 的坐标指示电流分布的调整参数。所以我会有一个数组,我可以在其中做类似的事情

mag_array.sel(r=0.1, offset=0.5)

这将返回给我为当前分布的那些特定参数计算的 4 维 xarray。

我发现我可以继续向原始 DataArray 添加额外的坐标,以指示不同的当前参数,但是对我来说携带这个可能有很多坐标的对象似乎很笨重。因此需要分层数据结构。

完成这种数据结构的自然方法是什么?

编辑: 我尝试过类似以下的方法。说B1B2 是我想合并的两个DataArrays。我尝试过类似的方法:

mag_array = xr.DataArray([B1, B2], 
                      coords=[('r', [0.1, 0.2])])

但是这会产生一个错误,因为我猜 xarray 在创建新数组时试图了解 B1 和 B2 的结构,因此实际上不是期望一个指定的维度(例如 r 在这种情况下)所有 4 个旧维度(vec_compxyz)的规范加上我通过将两个 xarray 放入一个数组中创建的新维度。

如果我尝试

mag_array = xr.DataArray([B1, B2])

确实会创建一个新数组,但如果我再看看

mag_array[0]

我取回了一个 xarray,但所有旧坐标信息已被删除。

本质上,我可以通过以下方式完成我喜欢的事情:

mag_array = np.zeros(2,2)
mag_array[0,0] = B1
mag_array[0,1] = B2

等等。或遍历事物,然后 mag_array 将具有我想要的行为。问题是它不会随身携带坐标,我必须自己跟踪这些信息。我怎样才能两全其美?一个可以携带我的对象而不关心对象的性质以及通过坐标而不是索引访问数组的能力的数组?

【问题讨论】:

  • 您的子结果对于vec_compxyz 的坐标或大小是否不同?还是一切都对齐了?
  • 在这种情况下都是对齐的。虽然我很好奇数据对于较大数组的不同条目具有不同形状的可能性。
  • @shoyer 考虑到数据 xarray 都具有相同的结构,您是否知道如何实现这一点?

标签: python data-structures python-xarray


【解决方案1】:

要组合单独的 DataArray 对象,可以使用xarray.concat(),例如,

mag_array = xr.concat([B1, B2], dim=pd.Index([0.1, 0.2], name='r'))

如果您分配额外的标量坐标(我推荐),您只需指定要按名称连接的坐标,例如,

mag_array = xr.concat([B1.assign_coords(r=0.1), B2.assign_coords(r=0.2)], dim='r')

还值得看看像 xarray.open_mfdataset() 这样的辅助函数,它结合了从磁盘打开文件并沿共享轴连接它们的过程,例如 xr.open_mfdataset('all/my/files/*.nc')

open_mfdataset 目前最多只能连接一个维度,但未来计划扩展它以处理多个维度。

最后,请注意 xarray(当前)没有任何版本的非对齐轴的分层数据结构。对齐的轴是xarray.Datasetxarray.DataArray 的数据模型的有意约束。如果您的子组沿公共轴对齐,则需要在一些单独的数据结构中跟踪它们。

【讨论】:

  • 是否可以将任何类型的非简单数据放入 xarray 中?假设,类似于我上面的示例,我想将一些复杂对象存储在坐标数组中的某个位置,以便我可以通过其坐标重新访问该对象。这通常在 xarray 中是可能的吗?假设对象没有任何内部坐标(它不是 xarray 什么的,它只是某个对象)。
  • 您当然可以将任意对象放入 xarray 对象中,例如,通过具有 object dtype 的 NumPy 数组。
  • 是的,我发现了这一点。然而,一个问题是,如果我尝试将 xarray 对象放入另一个 xarray 中,包会尝试简单地创建一个更高维的 xarray 对象。我可以看到这在许多用例中是如何有意义的,但是如果有可能在不处理任何有关内部 xarray 的内部结构的情况下创建 xarray 的 xarray,那就太好了。我认为这可能是另一个问题的材料,或者是关于 xarray github 或其他东西的讨论……
猜你喜欢
  • 2017-06-13
  • 2020-02-03
  • 2019-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多