BraTS20数据集getListAgeDays函数X_all形状异常问题求助
BraTS20数据集脑肿瘤分析:getListAgeDays返回空数组问题排查
问题描述
在基于BraTS20数据集的脑肿瘤分析项目中,调用getListAgeDays函数计算特征时出现异常:预期生成有效特征数组,但实际返回的X_all形状为(0,),是空数组。已确认train_and_test_ids、age_dict、days_dict等输入参数均正确定义且包含数据,仍无法定位问题,寻求排查思路。
相关代码
# id: age, categories def getListAgeDays(id_list): x_val = [] y_val = [] for i in id_list: if (i not in age_dict): continue masks = getMaskSizesForVolume(nib.load(TRAIN_DATASET_PATH + f'BraTS20_Training_{i[-3:]}/BraTS20_Training_{i[-3:]}_seg.nii').get_fdata()) brain_vol = getBrainSizeForVolume(nib.load(TRAIN_DATASET_PATH + f'BraTS20_Training_{i[-3:]}/BraTS20_Training_{i[-3:]}_t1.nii').get_fdata()) masks[1] = masks[1]/brain_vol masks[2] = masks[2]/brain_vol masks[3] = masks[3]/brain_vol merged=[age_dict[i],masks[1],masks[2],masks[3]] ## add segments x_val.append(merged) if (days_dict[i] < 250): y_val.append([1,0,0]) elif (days_dict[i] >= 250 and days_dict[i] < 450): y_val.append([0,1,0]) else: y_val.append([0,0,1]) return np.array(x_val), np.array(y_val) X_all, y_all = getListAgeDays(train_and_test_ids) print(f'X_test: {X_all.shape}') df = pd.DataFrame(np.concatenate((X_all, y_all), axis=1) , columns = ["age",f"{SEGMENT_CLASSES[1]}",f"{SEGMENT_CLASSES[2]}",f"{SEGMENT_CLASSES[3]}","short","medium","long"]) df.head()
实际输出
(array([], dtype=float64), array([], dtype=float64)) X_test: (0,)
排查思路
- 验证ID与字典键的匹配一致性:即使
age_dict包含数据,也要确认train_and_test_ids中的每个ID格式是否和age_dict的键完全一致(比如是否存在大小写差异、前后空格、ID长度不符等)。可以在循环内添加调试打印:
查看哪些ID被print(f"当前ID: {i}, 是否在age_dict中: {i in age_dict}")continue语句跳过。 - 检查文件路径拼接正确性:代码中通过
i[-3:]截取ID后三位拼接路径,需确认train_and_test_ids中的ID格式是否符合预期(比如是否为长度足够的字符串,后三位确实对应数据集的编号)。同时检查TRAIN_DATASET_PATH是否以斜杠结尾,避免路径拼接错误。可以打印完整路径手动验证文件是否存在:seg_path = TRAIN_DATASET_PATH + f'BraTS20_Training_{i[-3:]}/BraTS20_Training_{i[-3:]}_seg.nii' print(f"当前分割文件路径: {seg_path}") - 捕获子函数执行异常:
getMaskSizesForVolume或getBrainSizeForVolume执行出错可能导致当前ID处理中断,甚至终止整个循环。可以添加异常捕获代码:try: masks = getMaskSizesForVolume(nib.load(seg_path).get_fdata()) t1_path = TRAIN_DATASET_PATH + f'BraTS20_Training_{i[-3:]}/BraTS20_Training_{i[-3:]}_t1.nii' brain_vol = getBrainSizeForVolume(nib.load(t1_path).get_fdata()) except Exception as e: print(f"处理ID {i}时出错: {str(e)}") continue - 确认
days_dict的键存在性:循环中直接调用days_dict[i],若ID不在days_dict中会触发KeyError,可能导致循环中断。可以在跳过age_dict检查后,新增days_dict存在性判断:if i not in days_dict: print(f"ID {i}不在days_dict中") continue - 验证循环是否实际执行:在循环开头添加打印语句,确认
train_and_test_ids非空且循环正常启动:print(f"正在处理第{id_list.index(i)+1}个ID: {i}")
内容的提问来源于stack exchange,提问作者Sheeraz Ali
相关产品推荐
相关产品推荐

