为什么Python列表推导式索引allel基因型数组时报IndexError错误?
错误原因分析
- 第一段代码的索引
[x in PARENT_SAMPLES for x in callset_all_sample_ids]生成的是布尔值列表,每个元素对应样本ID是否属于亲本样本,布尔数组是numpy/allel数组支持的合法索引类型,因此可以正常运行。 - 第二段代码的索引
[x for x in callset_all_sample_ids]生成的是字符串列表,每个元素都是样本ID字符串,而GenotypeArray的第二维度是样本的位置维度,仅支持整数、布尔数组等数值类索引,不接受字符串作为索引值,因此触发IndexError。
解决方案
如果你需要获取所有样本的对应信息,直接用切片语法即可,无需显式传入索引列表:
CHROM = "3R" g = allel.GenotypeDaskArray(callset[CHROM]['calldata/GT']).compute() g_all = g[:, :] g_all
如果确实需要通过样本ID列表筛选索引(比如后续需要自定义筛选部分样本),可以先建立样本ID到位置索引的映射,再将字符串ID转为整数索引后使用:
# 先构建ID到索引的映射字典 sample_id_to_idx = {sid: idx for idx, sid in enumerate(callset_all_sample_ids)} # 将字符串ID转为整数索引后再索引 g_all = g[:, [sample_id_to_idx[x] for x in callset_all_sample_ids]]
内容的提问来源于stack exchange,提问作者mcrepeau
相关产品推荐
相关产品推荐

