我已经对一个包含点云中每个点的X、Y和Z坐标的数据集应用了DBSCAN进行聚类。我希望只绘制那些包含少于100个点的聚类。以下是我目前的代码:
clustering = DBSCAN(eps=0.1, min_samples=20, metric='euclidean').fit(only_xy)plt.scatter(only_xy[:, 0], only_xy[:, 1], c=clustering.labels_, cmap='rainbow')clusters = clustering.components_#存储标签labels = clustering.labels_#然后获取非负标签的频率计数counts = np.bincount(labels[labels>=0])print(counts)Output: [1278 564 208 47 36 30 191 54 24 18 40 915 26 20 24 527 56 677 63 57 61 1544 512 21 45 187 39 132 48 55 160 46 28 18 55 48 35 92 29 88 53 55 24 52 114 49 34 34 38 52 38 53 69]
所以我已经找到了每个聚类中的点数,但我不知道如何只选择那些包含少于100个点的聚类。
回答:
你可以找到那些计数少于100的标签的索引:
ls, cs = np.unique(labels,return_counts=True)dic = dict(zip(ls,cs))idx = [i for i,label in enumerate(labels) if dic[label] <100 and label >= 0]
然后你可以将得到的索引应用到你的DBSCAN结果和标签中,类似于(或多或少):
plt.scatter(only_xy[idx, 0], only_xy[idx, 1], c=clustering.labels_[idx], cmap='rainbow')