Python:指具有相同键的多个词典
我试图找到几个具有相同键的词典的平均值(词典的数量取决于用户的选择)。每个键都是一个n维numpy数组 我用这个方法得到了我的答案 我使用的函数是Python:指具有相同键的多个词典,python,dictionary,numpy,Python,Dictionary,Numpy,我试图找到几个具有相同键的词典的平均值(词典的数量取决于用户的选择)。每个键都是一个n维numpy数组 我用这个方法得到了我的答案 我使用的函数是 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+"+"+nam
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'))
我在两个字典中使用相同的值进行测试。
我这样调用函数
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'))
我认为这个方法很老套,有没有更好的方法解决这个问题 构建一个字符串来评估它不是很优雅。更好地结合使用,所有功能均由列表
[]
和dict{}
理解功能启用。首先,将字典列表R
转换为字典列表S
:
S = {k:[ R[j][k] for j in range(len(R)) ] for k in R[0].keys()}
现在,每个键只有一个“裸”numpy数组列表,可以使用np添加。添加,然后除以单个列表的长度:
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]])}
请将链接外的内容作为问题的一部分。内容是一个json文件,由我的ipython笔记本创建。我将把python代码粘贴到这里。这正是我想要的!。谢谢