1

との加重平均を取得するための最も簡単/最短/最もPythonの方法ab何でしょうか?

a = (
        {
          0: {'P': 0.3, 'Z': 0.3, 'N': 0.3}, 
        'P': {'P': 0.9, 'Z': 0.1, 'N': 0.0}, 
        'Z': {'P': 0.1, 'Z': 0.9, 'N': 0.1}, 
        'N': {'P': 0.0, 'Z': 0.1, 'N': 0.9}
        },

        {
         'P': {'A': 0.3, 'C': 0.3, 'T': 0.2, 'G': 0.2}, 
         'Z': {'A': 0.3, 'C': 0.3, 'T': 0.2, 'G': 0.2}, 
         'N': {'A': 0.3, 'C': 0.3, 'T': 0.2, 'G': 0.2}
        }
    )

b = (
        {
          0: {'P': 0.3, 'Z': 0.3, 'N': 0.3}, 
        'P': {'P': 0.3, 'Z': 0.3, 'N': 0.3}, 
        'Z': {'P': 0.3, 'Z': 0.3, 'N': 0.3}, 
        'N': {'P': 0.3, 'Z': 0.3, 'N': 0.3}
        },

        {
         'P': {'A': 0.25, 'C': 0.25, 'T': 0.25, 'G': 0.25}, 
         'Z': {'A': 0.25, 'C': 0.25, 'T': 0.25, 'G': 0.25}, 
         'N': {'A': 0.25, 'C': 0.25, 'T': 0.25, 'G': 0.25}
        }
    )

結果c = [(a * a_weight) + (b * b_weight) / (a_weight + b_weight)]同じ構造(ab)を持つようにします。

誰かがPythonicの答えを知っているなら、ありがとう。

結果のc構造の例

たとえば、a_weight= b_weight= 0.5(単純平均)の場合、cの最初の'P':

'P': {'P': (0.9 + 0.3) / 2, 'Z': (0.1 + 0.3) / 2, 'N': (0.0 + 0.3) / 2}

の平均になります

a's'P': {'P': 0.9, 'Z': 0.1, 'N': 0.0}および
b's 'P': {'P': 0.3, 'Z': 0.3, 'N': 0.3}

基本的に、sの平均だけですvalue(すべてkeyがそのままである間)。

4

1 に答える 1

2

2つの入力を受け取り、それらのタイプに応じて再帰的に変換する関数を作成します。

def combine(a, b, a_weight, b_weight):
    if isinstance(a, tuple):
        return tuple(combine(x,y,a_weight,b_weight) for x,y in zip(a,b))
    elif isinstance(a, dict):
        return dict((k, combine(a[k],b[k],a_weight,b_weight)) for k in a)
    #add other data structures here if you need to (e.g. list, set, etc.)
    else: #assume a number
        return ((a * a_weight) + (b * b_weight)) / (a_weight + b_weight)

このメソッドの良いところは、入力の構造を変更しても機能し続けることです。

このコードは、との構造が同じであり、タプルが同じ数の要素を持ち、辞書が同じキーを持っていることを前提としていることに注意してaくださいb。これが常に当てはまるとは限らない場合は、これを確認するためのコードを追加する必要があります。

于 2012-01-02T13:40:57.207 に答える