Как я могу вычислить отпечаток графа Моргана как numpy.array? - PullRequest
0 голосов
/ 21 февраля 2019

Я хотел бы использовать rdkit для генерации отпечатков пальцев Моргана и передачи их в модель обучения scikit (на Python).Тем не менее, я не знаю, как создать отпечаток в виде массива.Когда я использую

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 голосов
/ 12 марта 2019

Может быть немного поздно ответить, но эти методы работают для меня

Если вы хотите, чтобы биты (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()
0 голосов
/ 23 февраля 2019
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, поэтому я строю его из словаря.

...