Python代码执行append后data_list为空,np.concatenate报维度错误如何解决
S3DIS数据集处理代码空列表报错修复方案
核心问题定位
你遇到的报错有两个触发原因:
data_list为空,np.concatenate误将空列表和整数0识别为两个待拼接的对象,触发维度不匹配- 代码本身
np.concatenate的传参写法存在语法错误
具体修复步骤
- 第一步:修复路径匹配问题,排查空列表根源
路径中混用正反斜杠会导致glob在Windows系统下匹配失败,先统一路径格式并添加匹配校验:
def convert_pc2ply(anno_path, save_path): """ Convert original dataset files to ply file (each line is XYZRGBL). We aggregated all the points from each instance in the room. :param anno_path: path to annotations. e.g. Area_1/office_2/Annotations/ :param save_path: path to save original point clouds (each line is XYZRGBL) :return: None """ data_list = [] # 新增:统一路径为系统兼容格式,打印匹配结果 anno_path = os.path.abspath(anno_path) txt_files = glob.glob(os.path.join(anno_path, '*.txt')) print(f"路径{anno_path}下匹配到txt文件数:{len(txt_files)}") for f in txt_files: class_name = os.path.basename(f).split('_')[0] if class_name not in gt_class: # note: in some room there is 'staris' class.. class_name = 'clutter' pc = pd.read_csv(f, header=None, delim_whitespace=True).values labels = np.ones((pc.shape[0], 1)) * gt_class2label[class_name] data_list.append(np.concatenate([pc, labels], 1)) # Nx7
如果打印的匹配数为0,检查数据集是否完整解压、Annotations目录下是否存在txt文件、传入的anno_path参数是否拼写错误。
- 第二步:修复
np.concatenate语法错误,添加空列表校验
原代码将拼接轴参数0放到了待拼接对象的元组中,属于语法错误,同时增加空列表判断避免异常:
print(data_list) # 新增:空列表校验 if not data_list: print(f"警告:{anno_path}下无有效标注数据,跳过保存") return # 修复concatenate传参错误:axis=0为第二个参数,不放入待拼接元组 pc_label = np.concatenate(data_list, axis=0) # 后续代码无需修改 xyz_min = np.amin(pc_label, axis=0)[0:3] pc_label[:, 0:3] -= xyz_min xyz = pc_label[:, :3].astype(np.float32) colors = pc_label[:, 3:6].astype(np.uint8) labels = pc_label[:, 6].astype(np.uint8) write_ply(save_path, (xyz, colors, labels), ['x', 'y', 'z', 'red', 'green', 'blue', 'class'])
- 可选校验:如果匹配到文件后
data_list还是为空,检查全局变量gt_class、gt_class2label是否正确定义,确认gt_class2label中存在clutter的映射关系,避免类别映射报错导致无数据写入列表。
内容的提问来源于stack exchange,提问作者youssef
相关产品推荐
相关产品推荐

