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

从分子指纹CSV计算Tanimoto相似度遇参数错误求助

错误原因

你传入BulkTanimotoSimilarity的是pandas的Series和切片对象,而RDKit的该函数仅接受RDKit原生指纹对象(如SparseIntVect/ExplicitBitVect),且第二个参数要求是Python列表而非pandas结构。


修复方案

1. 将CSV数据转换为RDKit指纹对象

你的指纹包含非0/1数值(如示例中的3),属于计数型指纹,需转换为SparseIntVect对象:

import pandas as pd
from rdkit.DataStructs import SparseIntVect

# 读取CSV数据
input_data = pd.read_csv("file.csv", delimiter=',', header=None)

# 批量转换为RDKit计数指纹
fp_list = []
for _, row in input_data.iterrows():
    fp = SparseIntVect(2048)  # 2048对应你的指纹位数
    for bit_idx, count in enumerate(row):
        if count > 0:
            fp[bit_idx] = count
    fp_list.append(fp)

2. 修正Tanimoto距离计算函数

确保传入RDKit指纹对象的Python列表,调整后代码:

from rdkit import DataStructs

def tanimoto_distance_matrix(fp_list):
    dissimilarity_matrix = []
    for i in range(1, len(fp_list)):
        # fp_list[:i]是Python列表,符合BulkTanimotoSimilarity参数要求
        similarities = DataStructs.BulkTanimotoSimilarity(fp_list[i], fp_list[:i])
        dissimilarity_matrix.extend([1 - x for x in similarities])
    return dissimilarity_matrix

# 计算距离矩阵
dist_matrix_raw = tanimoto_distance_matrix(fp_list)

补充:若为二进制指纹(仅0/1)的处理

如果你的指纹实际是二进制(示例中的3为输入错误),可转换为ExplicitBitVect:

from rdkit.DataStructs.cDataStructs import ExplicitBitVect

fp_list = []
for _, row in input_data.iterrows():
    fp = ExplicitBitVect(2048)
    for bit_idx, val in enumerate(row):
        if val == 1:
            fp.SetBit(bit_idx)
    fp_list.append(fp)

关键注意事项

  • RDKit指纹计算函数仅识别自身定义的指纹对象,不能直接传入pandas结构。
  • 计数型指纹用SparseIntVect,二进制指纹用ExplicitBitVect,需根据实际指纹类型选择。

内容的提问来源于stack exchange,提问作者user22710686

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:58:39