调用RDKit的BulkTanimotoSimilarity时出现参数类型不匹配错误
解决RDKit中DataStructs.BulkTanimotoSimilarity的参数类型不匹配问题
问题根源
错误信息明确说明,DataStructs.BulkTanimotoSimilarity的参数需要是指纹对象(如ExplicitBitVect或SparseBitVect),但你传入的是Mol对象和Mol列表,完全不符合函数的参数类型要求。
修正步骤
1. 将Mol对象转换为指纹
在生成molecules列表后,需要把每个有效的Mol对象转换成指纹(RDKit支持多种指纹类型,这里以常用的Morgan指纹为例):
# 初始化Morgan指纹生成器 fp_gen = rdFingerprintGenerator.GetMorganGenerator(radius=2, fpSize=2048) # 生成指纹列表,同时过滤转换失败的Mol对象(无效SMILES会生成None) fgrps = [] for mol in molecules: if mol is not None: fp = fp_gen.GetFingerprint(mol) fgrps.append(fp) # 定义指纹数量 nfgrps = len(fgrps)
也可以用列表推导式简化:
fgrps = [fp_gen.GetFingerprint(mol) for mol in molecules if mol is not None] nfgrps = len(fgrps)
2. 确保相似度计算函数使用指纹列表
你的pairwise_similarity函数逻辑本身没问题,但要确保传入的fingerprints_list是指纹列表而非Mol列表。修正后的完整调用流程:
# 定义计算成对相似度的函数 def pairwise_similarity(fingerprints_list): n = len(fingerprints_list) similarities = np.zeros((n, n)) for i in range(1, n): # 此时传入的是指纹对象和指纹子列表,符合函数要求 similarity = DataStructs.BulkTanimotoSimilarity(fingerprints_list[i], fingerprints_list[:i]) similarities[i, :i] = similarity similarities[:i, i] = similarity return similarities # 计算相似度 similarities = pairwise_similarity(fgrps) tri_lower_diag = np.tril(similarities, k=0)
额外注意事项
- 必须过滤无效的
Mol对象:部分SMILES可能无法转换为Mol(比如格式错误),会生成None,直接用于指纹生成会报错,因此必须添加过滤逻辑。 - 指纹类型选择:除了Morgan指纹,你也可以使用RDKit指纹(
Chem.RDKFingerprint(mol))或其他类型,只要最终生成的是符合要求的指纹对象即可。
内容的提问来源于stack exchange,提问作者Antony Joseph
相关产品推荐
相关产品推荐

