一个字典的点积 Python

Dot Product With One Dictionary Python

我需要计算字典中两个键的点积。

res = {'Ben':['5', '0', '0', '0', '1', '4', '2'...], 
'Moose': ['5', '5', '0', '0', '0', '0', '3'...]}

我想制作这样的东西。我想将 Ben 的值乘以 Moose 的值。

Ans = 31 [5*5 + 0*5 + 0*0 + 0*0 + 1*0 + 4*0 + 2*3...]

我怎样才能用字典做到这一点?有了这个列表,我可以调用 np.dot 函数或编写一个小循环。

您可以使用 zip 并按如下方式一起迭代两个键:

sum = 0
for x, y in zip(res['Ben'], res['Moose']):
    sum += int(x) * int(y)
print(sum)

您可以在形成点积的列表理解上使用 sum

res = {'Ben':['5', '0', '0', '0', '1', '4', '2'], 
'Moose': ['5', '5', '0', '0', '0', '0', '3']}

ans = sum(int(b) * int(m) for b, m in zip(res['Ben'], res['Moose']))
print(ans)

输出:

31

使用 zipsum 的一种方式:

sum(int(i) * int(j) for i, j in zip(*res.values()))

输出:

31

如果键的数量是动态的(因此列表的数量也是动态的),您可以使用 operator.mulfunctools.reduce:

创建一个可扩展的函数
# Sample data with 3 keys

res3 = {'Ben':['5', '0', '0', '0', '1', '4', '2'], 
        'Moose': ['5', '5', '0', '0', '0', '0', '3'],
        'Chris': ['5', '5', '0', '0', '0', '0', '3']}

from operator import mul
from functools import reduce

def cummul(iterable):
    return reduce(mul, (int(i) for i in iterable))

sum(cummul(it) for it in zip(*res3.values()))

输出:

143

您可以执行类似的操作:

res = {'Ben':['5', '0', '0', '0', '1', '4', '2'], 
'Moose': ['5', '5', '0', '0', '0', '0', '3']}

ans = {}
for k, v in res.items():
    if(len(ans.keys())) == 0:
        ans = v
    ans_temp = [v1*v2 for v1, v2 in zip(ans, v)]
    ans = ans_temp

print(sum(ans))

 

这应该适用于任意长度的任何字典。

对于字典中的任何键,只需使用 mathzip。请注意,对于 math.prod:

,这需要 python 3.8 或更高版本
sum(math.prod(map(int, i)) for i in zip(*res.values()))

使用 numpy 数组是个好主意,它可以让您的代码更短、更清晰、更易读:

import numpy as np
x = np.array([[int(j) for j in i] for i in list(res.values())])
ans = x.prod(axis=0).sum()
print(ans)

无论 res 中有多少项目,上面的代码都可以正常工作。