python - 从“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 为中心的方式来做到这一点?
解决方案
如果你想要纯 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')}
推荐阅读
- typescript - 一个 Typescript 接口,它允许 2 个可选键之一或没有,但不能同时使用
- m2doc - M2DOC : 变量 self 的初始化
- mocking - Mockito 中的间谍和带代表团的模拟之间的区别
- python - 为什么调试日志没有在控制台和文件中打印
- jquery - 重复无休止的文本选取框
- algorithm - 这个子串 + 连接算法的大 O 是多少?
- ruby-on-rails - 在每个控制器操作之前调用第三方 api 是一种好习惯吗?
- javascript - 如何检查对象数组是否为空?
- c# - 径向滑块 UWP
- rollup - 使用 rollup 和 roll-plugin-postcss 时如何向生成的 css 文件添加哈希