2013-10-29 107 views
3

我試圖用相同的鍵找到幾個字典(字典的數量將取決於用戶選擇)的意思。每個鍵是一個n維numpy數組。Python:使用相同鍵的幾個字典的均值

我用這個方法得到了我的解決方案

ipython notebook viewer

我使用的功能是

def metaa(lis,name): 
    x = len(lis) 
    pr="" 
    for i in xrange(x): 
     if i == 0: 
      pr = pr+name+"["+str(i)+"][x]" 
     else: 
      pr = pr+"+"+name+"["+str(i)+"][x]" 
    pr = "("+pr+")/"+str(x)     
    return pr 

我創造了這樣的字典。

import numpy as np 
a1 = np.random.randint(100,size=(3,10)) 
a2 = np.random.randint(100,size=(3,10)) 
a3 = np.random.randint(100,size=(3,10)) 
al=[a1,a2,a3] 
dicta = {'a1':a1,'a2':a2,'a3':a3} 
dictb = {'a1':a1,'a2':a2,'a3':a3} 
R = [dicta,dictb] 

我在這兩個字典中使用相同的值進行測試。 我這樣稱呼功能。

Res = {} 
for x in R[0]: 
    Res[x] = eval(metaa(R,'R')) 

我覺得這種方法很駭人,有沒有更好的方法解決這個問題?

+2

請從鏈接中包含內容作爲問題的一部分。 – zero323

+0

內容是一個json文件,由我的ipython筆記本創建。我將在這裏粘貼python代碼。 – abcd

回答

3

構建一個字符串來評估它不是很優雅。更好地使用reducenp.add的組合,全部通過列表[]和字典{}解釋啓用。首先,詞典R的列表轉換爲列表S字典:

S = {k:[ R[j][k] for j in range(len(R)) ] for k in R[0].keys()} 

現在,每個鍵只有可使用np.add通過的長度進行相加,然後除以「裸」 numpy的陣列列表個人名單:

S = {'a1': [array([[ 32, 120, 80, 380, 360, 212, 188, 56, 312, 112], 
        [388, 348, 196, 236, 60, 200, 224, 208, 24, 104], 
        [324, 296, 24, 52, 220, 12, 104, 52, 232, 196]]), 
      array([[ 32, 120, 80, 380, 360, 212, 188, 56, 312, 112], 
        [388, 348, 196, 236, 60, 200, 224, 208, 24, 104], 
        [324, 296, 24, 152, 220, 12, 104, 52, 232, 196]])], 
    'a2': [array([[30, 82, 99, 72, 79, 98, 93, 93, 28, 46], 
        [ 8, 17, 50, 59, 85, 73, 48, 97, 87, 41], 
        [98, 36, 27, 55, 98, 39, 73, 51, 27, 33]]), 
      array([[30, 82, 99, 72, 79, 98, 93, 93, 28, 46], 
        [ 8, 17, 50, 59, 85, 73, 48, 97, 87, 41], 
        [98, 36, 27, 55, 98, 39, 73, 51, 27, 33]])], 
    'a3': [array([[78, 24, 87, 83, 30, 14, 88, 57, 55, 73], 
        [76, 94, 99, 58, 63, 34, 70, 81, 45, 20], 
        [32, 61, 0, 3, 33, 33, 38, 90, 11, 3]]), 
      array([[78, 24, 87, 83, 30, 14, 88, 57, 55, 73], 
        [76, 94, 99, 58, 63, 34, 70, 81, 45, 20], 
        [32, 61, 0, 3, 33, 33, 38, 90, 11, 3]])]} 

計算平均:

T = {k:(reduce(np.add, v)/len(v)) for k,v in S.iteritems()} 

現在T是n的字典具有均值的不規則數組:

T = {'a1': array([[ 32, 120, 80, 380, 360, 212, 188, 56, 312, 112], 
        [388, 348, 196, 236, 60, 200, 224, 208, 24, 104], 
        [324, 296, 24, 152, 220, 12, 104, 52, 232, 196]]), 
    'a2': array([[30, 82, 99, 72, 79, 98, 93, 93, 28, 46], 
        [ 8, 17, 50, 59, 85, 73, 48, 97, 87, 41], 
        [98, 36, 27, 55, 98, 39, 73, 51, 27, 33]]), 
    'a3': array([[78, 24, 87, 83, 30, 14, 88, 57, 55, 73], 
        [76, 94, 99, 58, 63, 34, 70, 81, 45, 20], 
        [32, 61, 0, 3, 33, 33, 38, 90, 11, 3]])} 
+0

這正是我正在尋找的!謝謝。 – abcd

相關問題