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」の 2 つのクラスターです。
データをクラスター化するための優れた簡単な方法は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]