RDKit DataManip 度量矩阵计算指南:rdkit.DataManip 包与相似度/距离矩阵实战 科学计算科研机器学习【免费下载链接】rdkitThe official sources for the RDKit library项目地址https://gitcode.com/gh_mirrors/rd/rdkit点击查看免费下载rdkit.DataManip是 RDKit 中专门负责度量矩阵metric matrix计算的 Python 子包其核心模块rdkit.DataManip.Metric.rdMetricMatrixCalc提供了一组用于批量计算欧氏距离矩阵与 Tanimoto 相似度/距离矩阵的高性能 C 函数。本文以该包为线索先厘清其 API 文档所描述的包层级结构再深入讲解三个公开函数GetEuclideanDistMat、GetTanimotoDistMat、GetTanimotoSimMat的输入格式、返回值约定与典型用法最后结合仓库中的模板类实现MetricMatrixCalc.h、度量函数MetricFuncs.h与测试用例testMatricCalc.py从源码层面揭示其计算原理帮助读者在分子相似性筛选、聚类、虚拟筛选等场景中直接上手使用。rdkit.DataManip 的包结构与文档骨架RDKit 的 Python 侧 API 文档Sphinx 生成中rdkit.DataManip被组织为三层嵌套结构这与实际 Python 包布局完全一致rdkit.DataManip顶层包对应 rdkit.DataManip.rst其Subpackages一节通过 toctree 收录了唯一子包rdkit.DataManip.MetricModule contents一节则以automodule指令自动提取包的成员。rdkit.DataManip.Metric度量计算子包对应 rdkit.DataManip.Metric.rst包含唯一子模块rdkit.DataManip.Metric.rdMetricMatrixCalc。rdkit.DataManip.Metric.rdMetricMatrixCalc核心模块对应 rdkit.DataManip.Metric.rdMetricMatrixCalc.rst即度量矩阵计算的实际实现模块。Python 源码侧rdkit/DataManip/init.py 声明__all__ [Metric]而 rdkit/DataManip/Metric/init.py 通过from rdkit.DataManip.Metric.rdMetricMatrixCalc import *将 C 扩展模块的全部符号导入包命名空间。因此在实际代码中既可以用完整路径导入from rdkit.DataManip.Metric import rdMetricMatrixCalc as rdmmc也可以直接访问该扩展模块经rdkit_import_array()初始化 numpy API 后天然与 numpy 数组协作from rdkit.DataManip.Metric.rdMetricMatrixCalc import GetEuclideanDistMat该模块在文档中被描述为Module containing the calculator for metric matrix calculation, e.g. similarity and distance matrices即“用于度量矩阵如相似度矩阵与距离矩阵计算的模块”这正是 DataManip 包存在的意义。核心 API三个矩阵计算函数rdMetricMatrixCalc模块向 Python 侧暴露三个函数其完整 docstring 与签名均可在 Wrap/rdMetricMatrixCalc.cppBoost.Python 绑定面向传统构建与 nbWrap/rdMetricMatrixCalc.cppnanobind 绑定面向新版构建中找到。二者导出的函数名与行为完全一致。GetEuclideanDistMat(descripMat) —— 欧氏距离矩阵dmat rdmmc.GetEuclideanDistMat(descripMat)用途根据描述符矩阵使用欧氏距离度量计算两两样本之间的距离矩阵。输入descripMat接受以下三种形式之一详见下文“输入格式”一节形状为n × m的数值型二维 numpy 数组n为样本数m为描述符维数由一维数组/向量组成的列表列表的每个元素对应一个样本的描述符向量由列表/元组组成的列表或元组内部元素可被转换为double。返回值一个一维double数组仅包含对称距离矩阵的下三角元素不包含对角线。GetTanimotoDistMat(bitVectList) —— Tanimoto 距离矩阵dmat rdmmc.GetTanimotoDistMat(bitVectList)用途对一组分子指纹位向量计算 Tanimoto 距离矩阵距离定义为1 - Tanimoto 相似度。输入bitVectList由ExplicitBitVect或SparseBitVect组成的列表。返回值一维double数组下三角元素按行主序row-major排列。GetTanimotoSimMat(bitVectList) —— Tanimoto 相似度矩阵smat rdmmc.GetTanimotoSimMat(bitVectList)用途对一组分子指纹位向量计算 Tanimoto 相似度矩阵相似度取值为[0, 1]区间。输入与返回值与GetTanimotoDistMat相同仅计算的目标度量从距离换为相似度。三个函数中前一个面向连续数值描述符如理化性质向量、拓扑指数向量后两个面向二进制指纹向量覆盖了 RDKit 化学信息学流水线中最常见的两类“样本 × 特征”矩阵。输入格式详解与类型约束GetEuclideanDistMat的输入解析逻辑位于 Wrap/rdMetricMatrixCalc.cpp它对三种输入形式分别处理二维 numpy 数组通过PyArray_Check识别后取第 0 维为行数nrows样本数、第 1 维为列数ncols描述符维数。支持NPY_DOUBLE、NPY_FLOAT、NPY_INT三种 dtype其余类型如布尔、复数、对象数组会抛出ValueErrorThe array has to be of type int, float, or double for GetEuclideanDistMat。内部通过“二维数组指针技巧”——构造double**使desc2D[i]直接指向第i行数据——实现零拷贝访问连续内存。一维数组列表每个元素是 numpy 向量或一维数组包装成PySequenceHolderdouble供模板计算。值嵌套列表即list[list[double]]/tuple[tuple[double]]这类纯 Python 嵌套序列。此时所有条目统一转换为double计算源码注释指出由于列表可能是异构的无法预先询问其元素类型故统一按double处理。若各行长度不一致会抛出ValueErrorAll subsequences must be the same length。nanobind 版本nbWrap/rdMetricMatrixCalc.cpp逻辑与之对称先尝试将输入try_cast为二维nb::ndarray再依据dtype分别走double/float/int分支其余类型抛nb::value_error。GetTanimotoDistMat/GetTanimotoSimMat的输入校验更严格它们会检查列表首个元素的类型仅接受ExplicitBitVect或SparseBitVect实例否则抛出ValueErrorGetTanimotoDistMat can only take a sequence of ExplicitBitVects or SparseBitvects。另外两个函数都要求列表元素个数nrows 1CHECK_INVARIANT(nrows 1, )即至少两个样本才能构成成对矩阵。返回值约定一维下三角数组三个函数都返回一维double数组仅包含对称矩阵的下三角元素不含对角线。这是本模块最容易被误用的设计务必注意输出长度为n * (n - 1) / 2其中n为样本数。元素顺序为按行扫描索引i从 1 开始与j从 0 到i-1对应的度量值存放在一维数组的itab j处其中itab i * (i - 1) / 2。这一索引约定直接写死在模板类的核心循环中MetricMatrixCalc.hfor (unsigned int i 1; i nItems; i) { unsigned int itab i * (i - 1) / 2; for (unsigned int j 0; j i; j) { distMat[itab j] dp_metricFunc(descripts[i], descripts[j], dim); } }也就是说dmat[k]对应的是(i, j)对(1,0), (2,0), (2,1), (3,0), (3,1), (3,2), ...。若需要还原为完整对称矩阵可使用scipy.spatial.distance.squareform或手动填充。这种紧凑存储源于源码注释中说明的设计取舍只写入下三角可以避免重复计算每对样本只算一次同时减少内存占用其“不复制返回”的考量在 MetricMatrixCalc.h 的 FIX 注释中有详细交代。底层实现模板化的 MetricMatrixCalc 与度量函数Python 层函数的性能核心是 C 模板类RDDataManip::MetricMatrixCalcvectType, entryType定义于 MetricMatrixCalc.h。其设计要点如下两个模板参数vectType是支持operator[]的容器类型如PySequenceHolder、double**、std::vector...entryType是operator[]返回的元素类型如double*、ExplicitBitVect、SparseBitVect。正是这种抽象让同一套矩阵计算逻辑同时适用于“连续描述符”与“位向量”两类数据。度量函数指针通过setMetricFunc(double (*mFunc)(const entryType, const entryType, unsigned int))注入度量函数第三个参数dim维数对位向量场景无意义但对double*这类原始指针容器是必需的——源码注释对此有明确说明。防御性检查calcMetricMatrix开头使用CHECK_INVARIANT断言输出指针非空、度量函数已设置未设置函数时调用会直接失败。度量函数定义于 MetricFuncs.h共三个模板函数EuclideanDistanceMetric(v1, v2, dim)计算sqrt(Σᵢ (v1[i] − v2[i])²)即标准欧氏距离元素经static_castdouble统一后累加。TanimotoSimilarityMetric(bv1, bv2, dim)调用SimilarityWrapperTanimotoSimilarity计算 Tanimoto 相似度即 Jaccard 相似度交集比特数 ÷ 并集比特数dim参数被RDUNUSED_PARAM忽略。TanimotoDistanceMetric(bv1, bv2, dim)返回1.0 − TanimotoSimilarity将相似度映射为距离。源码中的 FIX 注释也指出该实现与TanimotoSimilarity耦合未来可将相似度函数作为模板参数进一步泛化。位向量相似度运算复用DataStructs子库的TanimotoSimilarity与SimilarityWrapper见 BitOps.h这解释了为何MetricMatrixCalc的链接依赖是DataStructs见 Wrap/CMakeLists.txt。实操示例从描述符到距离矩阵以下示例完整覆盖三种输入形式与指纹场景均可在 testMatricCalc.py 的测试用例中找到对应原型。场景一二维 numpy 数组double/float/int 均支持import numpy as np from rdkit.DataManip.Metric import rdMetricMatrixCalc as rdmmc desc np.zeros((3, 2), d) # 3 个样本2 维描述符 desc[1, 0] 1.0 desc[2, 0] 1.0 desc[2, 1] 1.0 dmat rdmmc.GetEuclideanDistMat(desc) print(dmat) # array([1., 1.414213, 1.])即 d(0,1)1, d(0,2)√2, d(1,2)1把 dtype 换成ffloat32或iint32结果一致测试用例test0DistsArray对三种类型逐一验证。场景二嵌套 Python 列表desc [[0.0, 0.0], [1.0, 0.0], [1.0, 1.0]] dmat rdmmc.GetEuclideanDistMat(desc) # 与场景一结果完全相同 desc_int [[0, 0], [1, 0], [1, 1]] dmat rdmmc.GetEuclideanDistMat(desc_int) # int 列表同样可用场景三指纹列表的相似度与距离矩阵from rdkit import DataStructs n, m, dm 30, 2048, 800 lst [] for i in range(n): v DataStructs.ExplicitBitVect(m) for j in range(dm): v.SetBit(random.randrange(0, m)) lst.append(v) sMat rdmmc.GetTanimotoSimMat(lst) dMat rdmmc.GetTanimotoDistMat(lst) # 距离与相似度互为补数sim dist 1.0test4ebv / test5sbv 验证 for i in range(n * (n - 1) // 2): assert abs(sMat[i] dMat[i] - 1.0) 1e-4SparseBitVect列表的用法完全一致测试用例test5sbv覆盖。注意测试用例test3Compare还验证了一个重要性质同一个n × m数组无论以 numpy 数组还是嵌套列表传入返回的下三角矩阵逐元素完全一致说明两种输入路径的计算结果可互换。测试验证与构建配置仓库为DataManip提供了完整的测试矩阵Python 测试Wrap/testMatricCalc.py 包含 6 个用例test0DistsArray二维数组三种 dtype、test2DistListList嵌套列表、test3Compare数组与列表结果一致性、test4ebv显式位向量 simdist 互补性、test5sbv稀疏位向量。其中test1DistsListArray被注释为c前缀当前未启用但逻辑完整。C 测试testMatCalc.cpp 直接演示了 C 侧的用法——构造double*连续内存与double**行指针后实例化MetricMatrixCalcdouble**, double*、setMetricFunc(EuclideanDistanceMetricdouble*, double*)并调用calcMetricMatrix结果逐行打印到标准输出。构建配置CMakeLists.txt 将两个头文件作为模板库安装rdkit_headers按开关编译 Boost.PythonRDK_BUILD_BOOST_PYTHON_WRAPPERS或 nanobindRDK_BUILD_NANOBIND_WRAPPERS包装Wrap/CMakeLists.txt 通过add_pytest(pyMatCalc ...)将testMatricCalc.py注册进 pytest 测试套件。典型应用场景与注意事项分子相似性筛选GetTanimotoSimMat可一次性得到整个化合物库的成对相似度配合阈值过滤即可完成初步相似性挑选。聚类输入GetEuclideanDistMat产出的紧凑距离矩阵可直接喂给层次聚类等算法如需完整方阵可用scipy.spatial.distance.squareform还原。虚拟筛选预处理先计算描述符矩阵再求距离避免在 Python 层写双重循环——核心循环完全在 C 模板中执行是此模块相对纯 Python 实现的主要性能优势。三点提醒一是返回值不含对角线、按i*(i-1)/2 j顺序展开二是位向量输入列表长度须大于 1三是GetEuclideanDistMat目前仅接受 int/float/double 数值数组混合类型或异构列表请先统一为double。总结rdkit.DataManip.Metric.rdMetricMatrixCalc是 RDKit 中“一条命令得到整张成对度量矩阵”的实用工具三个函数分别覆盖连续描述符的欧氏距离与指纹向量的 Tanimoto 相似度/距离输入支持 numpy 数组、向量列表与嵌套列表三种形态输出采用紧凑的一维下三角布局。其背后是模板类MetricMatrixCalc与三个度量函数模板构成的通用计算框架同一套逻辑可无缝复用double*、PySequenceHolder、ExplicitBitVect、SparseBitVect等不同容器。无论是做化合物库相似性分析、聚类还是虚拟筛选掌握本包的输入输出约定都能让成对矩阵计算变得高效而直接。感兴趣的读者可进一步阅读 MetricMatrixCalc.h 的类注释含容器适配的详细说明与 testMatricCalc.py 的完整用例获取最原汁原味的实现细节。赞分享科学计算科研机器学习【免费下载链接】rdkitThe official sources for the RDKit library项目地址https://gitcode.com/gh_mirrors/rd/rdkit点击查看免费下载相关推荐RDKit 度量矩阵计算模块 rdMetricMatrixCalc 指南从描述符到相似度 / 距离矩阵RDKit 度量矩阵计算模块 rdMetricMatrixCalc 指南从描述符到相似度 / 距离矩阵 rdkit.DataManip.Metric.rdMe科学计算科研机器学习RDKit rdMetricMatrixCalc 模块实战指南用欧氏距离与 Tanimoto 度量一键生成相似度/距离矩阵RDKit rdMetricMatrixCalc 模块实战指南用欧氏距离与 Tanimoto 度量一键生成相似度/距离矩阵 rdkit.DataManip.M科学计算科研机器学习RDKit 距离矩阵工具模块 rdkit.ML.Cluster.Resemblance 完全指南度量矩阵的存储格式、构建与查询RDKit 距离矩阵工具模块 rdkit.ML.Cluster.Resemblance 完全指南度量矩阵的存储格式、构建与查询 导读 rdkit.ML.Clu科学计算科研机器学习上一篇GitHub_Trending/py/python-docs-samples中的AI与社交网络内容推荐与用户建模下一篇OceanBase存储引擎混合存储性能测试查询延迟对比创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考