在 python 中,我们可以使用 counter 来查找列表中最常见的元素。有没有办法我们可以传入函数,以便我们可以反击落在一定范围内的元素。
假设我有 [123, 127, 99,75,86, 83,81],我想返回类似 {'12X':2, '8X':3, '99':1, '75':1 }
有任何想法吗?
在 python 中,我们可以使用 counter 来查找列表中最常见的元素。有没有办法我们可以传入函数,以便我们可以反击落在一定范围内的元素。
假设我有 [123, 127, 99,75,86, 83,81],我想返回类似 {'12X':2, '8X':3, '99':1, '75':1 }
有任何想法吗?
根据上下文,您尝试做的可能是:
那就是将您的元素分组到离散的箱/桶中,大小相同或预定义。使用 Pandas 之类的库很容易做到这一点:
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.cut.html
>>> pandas.cut([123, 127, 99, 75, 86, 83, 81], 4, labels=False)
array([3, 3, 1, 0, 0, 0, 0])
(上面写着“123 和 127 在第 3 组中,99 在第 1 组中,75、86、83、81 在第 0 组中”)。
当您不知道值但知道它们形成组时,这就是将您的元素分组到集群中。
像 "1, 2, 3, 11, 12, 13" 显然是两个簇 "1, 2, 3" 和 "11, 12, 13"。
K-means是一种对数据进行聚类的好方法,但还有其他算法,你应该看看scipy。
>>> import sklearn.cluster
>>> import numpy as np
>>>
>>> kmeans = sklearn.cluster.KMeans(n_clusters=4)
>>> kmeans.fit_predict(numpy.array([123, 127, 99, 75, 86, 83, 81]).reshape(-1, 1))
array([0, 0, 2, 3, 1, 1, 1], dtype=int32)
这个一共给了 123 和 127,单独给了 99,单独给了 75,一起给了 81 83 86。
这是一个简单的“GROUP BY”ala SQL,当您可以提供一个函数来返回您的值应该所在的组时:
喜欢:
>>> from itertools import groupby
>>> for key, group in groupby([123, 127, 99, 75, 86, 83, 81], lambda x: int(x / 10)):
... print(key, list(group))
...
12 [123, 127]
9 [99]
7 [75]
8 [86, 83, 81]