推荐支持类别名索引的N维深度学习实验结果高效数据结构
针对带标签多维实验结果的高效数据结构方案
1. Pandas MultiIndex DataFrame
把嵌套字典转换成带多层索引(MultiIndex)的DataFrame,完美适配你的3D标签结构,支持任意维度的切片和查询:
转换方法
先把嵌套字典展开为扁平的键值对,再构建MultiIndex:
import pandas as pd # 假设你的RESULTS是目标嵌套字典 flat_data = [] for training_style, ds_dict in RESULTS.items(): for dataset_name, model_dict in ds_dict.items(): for model_arch, result in model_dict.items(): flat_data.append((training_style, dataset_name, model_arch, result)) # 构建带多层索引的DataFrame df = pd.DataFrame(flat_data, columns=['training_style', 'dataset_name', 'model_arch', 'result']) df = df.set_index(['training_style', 'dataset_name', 'model_arch'])
灵活查询示例
- 获取所有训练风格、数据集下模型1的结果:
# 方法1:用xs选择指定层级的标签 model1_results = df.xs('1', level='model_arch') # 方法2:用loc直接切片 model1_results = df.loc[:, :, '1'] - 获取训练风格'X'下所有数据集和模型的结果:
x_style_results = df.xs('X', level='training_style')
优点:Pandas生态成熟,支持统计分析、可视化,适合结果是标量或一维数据的场景;缺点:对高维(>3D)数据的支持不如专用多维库直观。
2. xarray 带标签多维数组
xarray专门为带标签的多维数据设计,语法类似NumPy但保留标签,是处理深度学习实验多维结果(比如每个结果是张量、指标数组)的最优选择:
转换方法
import xarray as xr # 直接从嵌套字典构建DataArray(假设每个结果是标量或同形状数组) da = xr.DataArray.from_dict(RESULTS) # 或者手动指定维度与坐标(更灵活) first_train_style = next(iter(RESULTS.keys())) first_dataset = next(iter(RESULTS[first_train_style].keys())) da = xr.DataArray( data=[[list(model_dict.values()) for model_dict in ds_dict.values()] for ds_dict in RESULTS.values()], dims=['training_style', 'dataset_name', 'model_arch'], coords={ 'training_style': list(RESULTS.keys()), 'dataset_name': list(RESULTS[first_train_style].keys()), 'model_arch': list(RESULTS[first_train_style][first_dataset].keys()) } )
灵活查询示例
- 获取所有训练风格、数据集下模型1的结果:
model1_results = da.sel(model_arch='1') - 获取训练风格'X'、数据集'A'下所有模型的结果:
xa_results = da.sel(training_style='X', dataset_name='A') - 结合位置与标签的混合切片:
# 获取前2种训练风格、所有数据集、模型1的结果 partial_results = da.isel(training_style=slice(0,2)).sel(model_arch='1')
优点:原生支持N维带标签数据,完美适配张量型实验结果,切片/选择语法灵活;缺点:需要额外学习xarray的API,轻量场景可能有点重。
3. 自定义轻量带标签容器
如果不想依赖第三方库,可以自己实现一个简单的容器类,封装嵌套字典并支持类似数组的切片语法:
class LabeledNDArray: def __init__(self, data, dims): self.data = data self.dims = dims # 维度名称列表,比如['training_style', 'dataset_name', 'model_arch'] def __getitem__(self, keys): # 确保索引是元组格式,兼容单维度/多维度查询 if not isinstance(keys, tuple): keys = (keys,) current_data = self.data for key in keys: if key == slice(None): # 处理冒号全选 current_data = {k: current_data[k] for k in current_data.keys()} elif isinstance(key, str): current_data = current_data[key] elif isinstance(key, list): # 选择当前维度的多个标签 current_data = {k: current_data[k] for k in key if k in current_data} else: raise ValueError(f"不支持的索引类型: {type(key)}") return current_data # 使用示例 ln_darray = LabeledNDArray(RESULTS, ['training_style', 'dataset_name', 'model_arch']) # 获取所有训练风格、数据集下模型1的结果 model1_results = ln_darray[:, :, '1'] # 获取训练风格'X'、数据集['A','B']下所有模型的结果 xb_results = ln_darray['X', ['A','B'], :]
优点:轻量、完全自定义逻辑;缺点:需要自己实现复杂查询(比如布尔索引),缺乏内置的统计分析功能。
内容的提问来源于stack exchange,提问作者jiversivers
相关产品推荐
相关产品推荐

