【问题标题】:making of list of clusters from `sklearn` cluster labels output从“sklearn”集群标签输出中制作集群列表
【发布时间】:2021-04-12 11:54:27
【问题描述】:

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

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 为中心的方法?

【问题讨论】:

  • 您的结果是不规则形状,numpy 数组不能很好地处理它们。这通常强烈暗示基于循环的方法可能是唯一的方法。
  • @swag2198 这当然不是唯一的方法。这也有效:return [labs[labs == i] for i in range(howmany]。这对于小型数据集来说更快,但是是二次时间,所以最终会陷入困境。

标签: python numpy cluster-computing


【解决方案1】:

如果你想要纯 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')}

【讨论】:

    猜你喜欢
    • 2020-07-10
    • 2020-04-27
    • 2018-02-24
    • 2012-07-02
    • 1970-01-01
    • 2022-06-28
    • 2018-12-07
    • 1970-01-01
    • 2018-10-10
    相关资源
    最近更新 更多