如何计算 Count Morgan 指纹为 numpy.array?
How can I compute a Count Morgan fingerprint as numpy.array?
我想使用 rdkit 生成 Count 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。
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 数组的方法,所以我从字典中构建它。
也许回答有点晚,但这些方法对我有用
如果你想要位(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()
我想使用 rdkit 生成 Count 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。
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 数组的方法,所以我从字典中构建它。
也许回答有点晚,但这些方法对我有用
如果你想要位(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()