xarray分层数据组织

时间:2018-12-13 02:32:42

标签: python data-structures python-xarray

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

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

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

这将返回4维xarray,该xarray是针对当前分布的那些特定参数计算得出的。

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

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

编辑: 我已经尝试过以下方法。说B1B2是我要合并的两个DataArray。我已经尝试过类似的东西:

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

但是这会导致错误,因为我猜xarray在创建新数组时试图了解B1和B2的结构,因此它不是期望一个指定的维(例如r)实际上期望所有四个旧维度(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将具有我想要的行为。问题是它不会随身携带坐标,我必须自己跟踪这些信息。我如何才能两全其美?一个可以围绕我的对象而又不关心对象的性质以及是否可以通过坐标而不是通过索引访问该数组的数组的数组?

1 个答案:

答案 0 :(得分: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数据模型的有意约束。如果您的子组沿公共轴对齐,则需要在一些单独的数据结构中跟踪它们。