You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 04:01:08