4

次のように、並べ替えられたタプルのリストに2つの次元データが格納されています。

data = [(0.1,100), (0.13,300), (0.2,10)...

各タプルの最初の値であるX値は、タプルのリストに対して1回だけ発生します。つまり、0.1などの値は1つだけです。

次に、バケットの並べ替えられたリストがあります。バケットは、次のように、範囲とIDを含むタプルとして定義されます。

buckets = [((0,0.14), 2), ((0.135,0.19), 1), ((0.19,0.21), 2), ((0.19,0.24), 3)...

範囲はX軸を基準にしています。したがって、ID 2には上記の2つのバケットがあり、ID1と3にはそれぞれ1つのバケットしかありません。ID2の最初のバケットの範囲は0から0.14です。バケットは重複する可能性があることに注意してください。

したがって、データをバケットにドロップしてからスコアを合計するアルゴリズムが必要です。上記のデータの場合、結果は次のようになります。

1:0
2:410
3:10

各データがID2に関連付けられたバケットによってどのようにキャッチされるかに注意してください。したがって、スコアが取得され100+300+10=410ます。

これを行うためのアルゴリズムをどのように書くことができますか?

4

3 に答える 3

1

これにより、テスト データから目的の出力が生成されます。

data = [(0.1,100), (0.13,300), (0.2,10)]
buckets = [((0,0.14), 2), ((0.135,0.19), 1), ((0.19,0.21), 2), ((0.19,0.24), 3)]

totals = dict()

for bucket in buckets:
    bucket_id = bucket[1]
    if bucket_id not in totals:
        totals[bucket_id] = 0
    for data_point in data:
        if data_point[0] >= bucket[0][0] and data_point[0] <= bucket[0][1]:
            totals[bucket_id] += data_point[1]

for key in sorted(totals):
    print("{}: {}".format(key, totals[key]))
于 2012-12-02T01:27:29.060 に答える
1

このコードを試してください:

data = [(0.1,100), (0.13,300), (0.2,10)]
buckets = [((0,0.14), 2), ((0.135,0.19), 1), ((0.19,0.21), 2), ((0.19,0.24), 3)]

def foo(tpl): ## determine the buckets a data-tuple is enclosed by list of IDs
    x, s = tpl
    lst = []
    for bucket in buckets:
        rnge, iid = bucket
        if x>rnge[0] and x<rnge[1]: lst.append(iid)
    return lst

data = [[dt, foo(dt)] for dt in data]

scores_dict = {}
for tpl in data:
    score = tpl[0][1]
    for iid in tpl[1]:
        if iid in scores_dict: scores_dict[iid]+=score
        else:                  scores_dict[iid] =score

for key in scores_dict:
    print key,":",scores_dict[key]

このスニペットの結果は次のとおりです。

2 : 410
3 : 10

バケット ID が出力されない場合、そのバケットに X 値がないか、合計がゼロになります。

于 2012-12-02T00:52:15.297 に答える
1

各バケット定義 (ラベル範囲) を、データ タプルを指定してバケットの合計をインクリメントする callable に変換します。バケット値は単純な dict に格納されます。より単純な API を提供したい場合は、この概念をクラスに簡単にまとめることができます。

def partition(buckets, bucket_definition):
    """Build a callable that increments the appropriate buckets with a value"""

    lower, upper = bucket_definition[0]
    key = bucket_definition[1]

    def _partition(data):
        x, y = data
        # Set a default value for this key
        buckets.setdefault(key, 0)

        if lower <= x <= upper:
            buckets[key] += y

    return _partition


bucket_definitions = [
    ((0, 0.14), 2),
    ((0.135, 0.19), 1),
    ((0.19, 0.21), 2),
    ((0.19, 0.24), 3)
]

data = [(0.1, 100), (0.13, 300), (0.2, 10)]

# Holder for bucket labels and values
buckets = {}

# For each bucket definition (range, label) build a callable
partitioners = [partition(buckets, definition) for definition in bucket_definitions]

# Map each callable to each data tuple provided
for partitioner in partitioners:
    map(partitioner, data)

print(buckets)
于 2012-12-02T01:13:39.343 に答える