如何计算Count Morgan指纹为numpy.array?

时间:2019-02-21 14:32:34

标签: python-3.x scikit-learn rdkit

我想使用rdkit生成计数Morgan指纹并将它们提供给scikit Learn模型(在Python中)。但是,我不知道如何将指纹生成为numpy数组。当我使用

from rdkit import Chem
from rdkit.Chem import AllChem
m = Chem.MolFromSmiles('c1cccnc1C')
fp = AllChem.GetMorganFingerprint(m, 2, useCounts=True)

我得到了需要转换的UIntSparseIntVect。我发现的唯一东西是cDataStructs(请参阅:http://rdkit.org/docs/source/rdkit.DataStructs.cDataStructs.html),但这目前不支持UIntSparseIntVect。

2 个答案:

答案 0 :(得分:2)

回答也许有点晚,但是这些方法对我有用

如果需要位(0和1):

from rdkit.Chem import AllChem
from rdkit.Chem import DataStructs

mol = Chem.MolFromSmiles('c1cccnc1C')
fp = AllChem.GetMorganFingerprintAsBitVect(mol, 2, nBits=1024)
array = np.zeros((0, ), dtype=np.int8)
DataStructs.ConvertToNumpyArray(fp, array)

回到指纹:

bitstring = "".join(array.astype(str))
fp2 = DataStructs.cDataStructs.CreateFromBitString(bitstring)
assert list(fp.GetOnBits()) == list(fp2.GetOnBits())

如果要计数:

fp3 = AllChem.GetHashedMorganFingerprint(mol, 2, nBits=1024)
array = np.zeros((0,), dtype=np.int8)
DataStructs.ConvertToNumpyArray(fp3, array)
print(array.nonzero())

输出:

(array([ 19,  33,  64, 131, 175, 179, 356, 378, 428, 448, 698, 707, 726,
   842, 849, 889]),)

然后回到指纹(不确定这是最好的方法):

def numpy_2_fp(array):
    fp = DataStructs.cDataStructs.UIntSparseIntVect(len(array))
    for ix, value in enumerate(array):
        fp[ix] = int(value)
    return fp

fp4 = numpy_2_fp(array)
assert fp3.GetNonzeroElements() == fp4.GetNonzeroElements()

答案 1 :(得分:0)

from rdkit.Chem import AllChem
m = Chem.MolFromSmiles('c1cccnc1C')
fp = AllChem.GetHashedMorganFingerprint(m, 2, nBits=1024)
fp_dict = fp.GetNonZeroElements()
arr = np.zeros((1024,))
for key, val in fp_dict.items():
    arr[key] = val

似乎没有直接的方法来获取一个numpy数组,所以我从字典中构建它。