xarray 分层数据组织
xarray Hierarchical data organization
我有一个脚本可以计算 space 区域中由于特定电流分布而产生的磁场。该计算的结果存储在一个 xarray 中,其坐标为:vec_comp
、x
、y
和 z
。 vec_comp
跨越字符串 ['x', 'y', 'z']
以指示磁场的不同分量。
我正在为许多不同的电流配置计算此磁场(例如,具有不同半径和与感兴趣区域的距离的电流环路)。我想将这些磁场对象(xarrays)收集到另一个 xarray 中,该 xarray 的坐标指示当前分布的调整参数。所以我将有一个数组,我可以在其中执行类似
的操作
mag_array.sel(r=0.1, offset=0.5)
这将 return 对我来说是为当前分布的那些特定参数计算的 4 维 xarray。
我知道我可以继续并向原始 DataArray 添加额外的坐标以指示不同的当前参数,但是对我来说携带这个可能有很多坐标的对象似乎很笨重。因此需要分层数据结构。
完成这种数据结构的自然方法是什么?
编辑:
我试过类似下面的东西。假设 B1
和 B2
是我想合并的两个 DataArray。我试过类似的东西:
mag_array = xr.DataArray([B1, B2],
coords=[('r', [0.1, 0.2])])
但是这会产生错误,因为我猜 xarray 在创建新数组时试图识别 B1 和 B2 的结构,而不是期望一个指定的维度(例如本例中的 r
)它实际上期望所有 4 个旧维度(vec_comp
、x
、y
、z
)的规范加上我通过将两个 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 将具有我想要的行为。问题是它不会随身携带坐标,我必须自己跟踪这些信息。我怎样才能两全其美?一个可以携带我的对象而不关心对象的性质以及通过坐标而不是索引访问数组的能力的数组?
要合并单独的 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.Dataset
和 xarray.DataArray
数据模型的有意约束。如果您的子组不沿公共轴对齐,则需要在一些单独的数据结构中跟踪它们。
我有一个脚本可以计算 space 区域中由于特定电流分布而产生的磁场。该计算的结果存储在一个 xarray 中,其坐标为:vec_comp
、x
、y
和 z
。 vec_comp
跨越字符串 ['x', 'y', 'z']
以指示磁场的不同分量。
我正在为许多不同的电流配置计算此磁场(例如,具有不同半径和与感兴趣区域的距离的电流环路)。我想将这些磁场对象(xarrays)收集到另一个 xarray 中,该 xarray 的坐标指示当前分布的调整参数。所以我将有一个数组,我可以在其中执行类似
的操作mag_array.sel(r=0.1, offset=0.5)
这将 return 对我来说是为当前分布的那些特定参数计算的 4 维 xarray。
我知道我可以继续并向原始 DataArray 添加额外的坐标以指示不同的当前参数,但是对我来说携带这个可能有很多坐标的对象似乎很笨重。因此需要分层数据结构。
完成这种数据结构的自然方法是什么?
编辑:
我试过类似下面的东西。假设 B1
和 B2
是我想合并的两个 DataArray。我试过类似的东西:
mag_array = xr.DataArray([B1, B2],
coords=[('r', [0.1, 0.2])])
但是这会产生错误,因为我猜 xarray 在创建新数组时试图识别 B1 和 B2 的结构,而不是期望一个指定的维度(例如本例中的 r
)它实际上期望所有 4 个旧维度(vec_comp
、x
、y
、z
)的规范加上我通过将两个 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 将具有我想要的行为。问题是它不会随身携带坐标,我必须自己跟踪这些信息。我怎样才能两全其美?一个可以携带我的对象而不关心对象的性质以及通过坐标而不是索引访问数组的能力的数组?
要合并单独的 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.Dataset
和 xarray.DataArray
数据模型的有意约束。如果您的子组不沿公共轴对齐,则需要在一些单独的数据结构中跟踪它们。