Chciałbym skorzystać z RDKIT, aby wygenerować hrabia Morgan Fingerprints i karmić je do modelu Scikit Learn (w Pythonie). Nie wiem jednak, jak wygenerować odcisk palca jako macierzy numpy. Kiedy używam

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

Dostaję uintsparseintvectvect, który musiałbym konwertować. Jedyną rzeczą, którą znalazłem, były cdatAndructs (patrz: http://rdkit.org/ Dokumenty / Źródło / RDKIT.DATASTRUCT.CDATASTRUCTRUTS.HTML), ale obecnie nie obsługuje obecnie uintsparseinvect.

2
evilolive 21 luty 2019, 17:32

2 odpowiedzi

Najlepsza odpowiedź

Może trochę się do odpowiedzi, ale te metody działają dla mnie

Jeśli chcesz bitów (0 i 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)

Iz powrotem do odcisku palca:

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

Jeśli chcesz liczyć:

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

Wynik:

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

Iz powrotem do odcisku palca (nie jestem pewien, że jest to najlepszy sposób na to):

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()
2
Oliver Scott 12 marzec 2019, 14:52
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

Wygląda na to, że nie ma bezpośredniego sposobu, aby uzyskać numpy macierz, więc zbuduję go ze słownika.

0
evilolive 23 luty 2019, 17:56