Python:多个具有相同键的字典的平均数

3
我将尝试找到多个字典的平均值(字典数量取决于用户选择),这些字典具有相同的键。每个键都是一个n维numpy数组。
我使用了以下方法来解决问题: ipython笔记本查看器 我使用的函数是:
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
这是一个json文件,由我的ipython笔记本创建。我将在此粘贴Python代码。 - abcd
1个回答

4

构建一个字符串来评估它并不是非常优雅。最好使用reducenp.add相结合,这都可以通过列表[]和字典{}理解来实现。首先,将字典列表R转换为列表字典S

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

现在,每个键只有一个“裸”的numpy数组列表,可以使用np.add添加,然后除以单个列表的长度:
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是一个具有平均值的numpy数组的字典:
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]])}

这正是我正在寻找的!谢谢。 - abcd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接