使用HDF5Matrix拆分数据时报TypeError: Indexing elements must be in increasing order如何解决?
TypeError: Indexing elements must be in increasing order 报错处理
报错本质
HDF5Matrix 底层基于 HDF5 文件的随机读取能力实现,其离散索引读取接口强制要求传入的索引数组为严格递增的整数序列,一旦传入的索引存在乱序、逆序的情况,就会直接触发该类型校验错误。
高频触发场景
- 做训练/验证集拆分时,直接把随机抽样得到的乱序索引数组传入 HDF5Matrix 索引操作,没有对索引做排序处理
- 拼接多段离散区间索引时,没有按顺序整理区间对应的索引值,传入了类似
[5,2,9,1]的乱序索引集合 - 混淆了 Numpy 数组和 HDF5Matrix 的索引规则:Numpy 支持任意顺序的离散索引取值,但 HDF5 的底层读取逻辑不支持乱序的离散索引访问
可落地的解决方案
- 所有传入 HDF5Matrix 的离散索引,必须在索引取值前完成升序排序,参考修正流程:
# 错误触发逻辑 total_count = hdf5_dataset.shape[0] # 随机抽样得到的训练集索引默认是乱序的 train_index = np.random.choice(total_count, size=int(total_count*0.8), replace=False) # 直接传入乱序索引会触发报错 train_set = hdf5_dataset[train_index] # 修正后逻辑 train_index = np.random.choice(total_count, size=int(total_count*0.8), replace=False) train_index.sort() # 对抽样得到的索引做升序排序 train_set = hdf5_dataset[train_index] # 验证集索引同样做排序处理后再取值 val_index = np.setdiff1d(np.arange(total_count), train_index) val_set = hdf5_dataset[val_index] - 拆分时如果能确定对应的连续索引区间,优先使用连续切片语法取值,不需要生成离散索引数组,从根源规避索引顺序校验问题
- 需要对数据集做全局打乱顺序的操作时,先完成 HDF5 文件的顺序读取、把对应数据集加载到内存转换为 Numpy 数组后,再对 Numpy 数组做乱序索引操作,不要在 HDF5 读取阶段传入乱序索引
内容的提问来源于stack exchange,提问作者Adelovi
相关产品推荐
相关产品推荐

