首页 > 解决方案 > 从“sklearn”集群标签输出中制作集群列表

问题描述

sklearn的聚类输出生成标签列表(i第 th 元素将用它所在的集群进行标记。现在,假设我想要一个集群列表。有一种相当明显的方法:

def clustarrays(labs):
    howmany = np.max(labs)+1
    results = [[] for i in range(howmany)]
    for i in range(len(labs)):
        cnum = labs[i]
        results[cnum].append(i)
    return results


ll = [1, 2, 3, 0, 0, 5, 5, 5]

clustarrays(ll)
[[3, 4], [0], [1], [2], [], [5, 6, 7]]

这一切都非常好,但是对于大型数据集来说这将非常慢。有没有更以 numpy 为中心的方式来做到这一点?

标签: pythonnumpycluster-computing

解决方案


如果你想要纯 numpy 使用:

def clustarrays(labs):
    return np.split(np.argsort(labs),np.unique(labs,return_counts=True)[1].cumsum())

输出:

[array([3, 4]), array([0]), array([1]), array([2]), array([5, 6, 7]), array([], dtype=int64)]

我建议大熊猫:

import pandas as pd
def clustarrays(labs):
  df = pd.DataFrame({'labs':labs})
  return df.groupby(df.labs).groups

输出:

{0: Int64Index([3, 4], dtype='int64'), 1: Int64Index([0], dtype='int64'), 2: Int64Index([1], dtype='int64'), 3: Int64Index([2], dtype='int64'), 5: Int64Index([5, 6, 7], dtype='int64')}

推荐阅读