在Python中分组/聚类数字

Ada*_*yar 18 python iteration numbers

我用谷歌搜索过,我已经测试了,这让我在我的智慧结束时.我有一个我需要按相似性分组的数字列表.例如,在[1,6,9,10,110,105,109,134,139]的列表中,1 6 9将被放入列表中,100,102,105和109将被放入列表,134和139.我在数学方面很糟糕,我已经尝试过并试过这个,但我无法让它发挥作用.为了尽可能明确,我希望将10个值之间的数字组合在一起.有人可以帮忙吗?谢谢.

Ray*_*ger 29

有许多方法可以进行聚类分析.一种简单的方法是查看连续数据元素之间的间隙大小:

def cluster(data, maxgap):
    '''Arrange data into groups where successive elements
       differ by no more than *maxgap*

        >>> cluster([1, 6, 9, 100, 102, 105, 109, 134, 139], maxgap=10)
        [[1, 6, 9], [100, 102, 105, 109], [134, 139]]

        >>> cluster([1, 6, 9, 99, 100, 102, 105, 134, 139, 141], maxgap=10)
        [[1, 6, 9], [99, 100, 102, 105], [134, 139, 141]]

    '''
    data.sort()
    groups = [[data[0]]]
    for x in data[1:]:
        if abs(x - groups[-1][-1]) <= maxgap:
            groups[-1].append(x)
        else:
            groups.append([x])
    return groups

if __name__ == '__main__':
    import doctest
    print(doctest.testmod())
Run Code Online (Sandbox Code Playgroud)


Ned*_*der 6

这将找到组:

nums = [1, 6, 9, 100, 102, 105, 109, 134, 139]
for k, g in itertools.groupby(nums, key=lambda n: n//10):
    print k, list(g)

0 [1, 6, 9]
10 [100, 102, 105, 109]
13 [134, 139]
Run Code Online (Sandbox Code Playgroud)

请注意,如果nums实际上没有按照示例显示进行排序,则需要先对其进行排序.

  • 我唯一不喜欢这种方法的是``[1,6,9,99,100,134,139]``将*99*和*100*分组到不同的组中.最好是计算连续数据点之间的差异,以确定一个集群的开始位置和另一个集群的结束位置. (6认同)