使用python分隔DBSCAN中每个群集的坐标

时间:2019-05-15 14:10:04

标签: python-3.x

下面的脚本在单独的txt文件中为我提供了每个群集的坐标。但是我想按如下方式编辑文件的内容

通常,坐标将按以下方式打印

0.64   0.30   0.29
0.27   0.24   0.92
0.34   0.62   0.92
0.05   0.48   0.60
0.26   0.77   0.62
0.15   0.23   0.14
0.35   0.26   0.64

但是我需要它以每行所有这些整数,字母和单词的形式打印如下。

HETATM   1   O  HOH  1 W   0.64   0.30   0.29 1.00  43.38
HETATM   2   O  HOH  2 W   0.27   0.24   0.92 1.00  43.38
HETATM   3   O  HOH  3 W   0.34   0.62   0.92 1.00  43.38
HETATM   4   O  HOH  4 W   0.05   0.48   0.60 1.00  43.38
HETATM   5   O  HOH  5 W   0.15   0.23   0.14 1.00  43.38
HETATM   6   O  HOH  6 W   0.15   0.23   0.14 1.00  43.38
HETATM   7   O  HOH  7 W   0.15   0.23   0.14 1.00  43.38
HETATM   8   O  HOH  8 W   0.15   0.23   0.14 1.00  43.38
HETATM   9   O  HOH  9 W   0.15   0.23   0.14 1.00  43.38
HETATM  10   O  HOH 10 W   0.15   0.23   0.14 1.00  43.38

这类似于蛋白质的pdb文件(.pdb)格式

有人知道该怎么做吗? 下面是我的脚本

from sklearn.cluster import DBSCAN
import numpy as np
data = np.random.rand(500,3)

db = DBSCAN(eps=0.12, min_samples=1).fit(data)
labels = db.labels_
from collections import Counter
Counter(labels)

from collections import defaultdict

clusters = defaultdict(list)

for i,c in enumerate(db.labels_):
    clusters[c].append(data[i])

for k,v in clusters.items():
    np.savetxt('cluster{}.txt'.format(k), v, delimiter=",", fmt="%1.2f %1.2f %1.2f")

1 个答案:

答案 0 :(得分:0)

您可以通过以下方式修改两个for循环:

for i,c in enumerate(db.labels_):
    l = np.concatenate([['HETATM {}'.format(i), 'O  HOH  {} W'.format(i)],data[i],[1.00,  43.38]], axis=0)
    clusters[c].append(l)

for k,v in clusters.items():
    np.savetxt('cluster{}.txt'.format(k), v, delimiter=",", fmt='%s')

,您将获得数据集中的样本编号,例如:

HETATM 2,O  HOH  2 W,0.27035681984544035,0.25141288216432167,0.44097961252275675,1.0,43.38
HETATM 21,O  HOH  21 W,0.2905981520836243,0.2680383230921106,0.47545544921372906,1.0,43.38