我有两个列表,一个名为A,另一个名为B. A中的每个元素都是三元组,B中的每个元素只是一个数字。我想计算定义为的结果:
结果= A [0] [0] * B [0] + A [1] [0] * B [1] + ... + A [n-1] [0] * B [n-1 ]
我知道逻辑很简单但是如何用pythonic方式编写?
谢谢!
答案 0 :(得分:32)
Python 3.5对点积有一个显式运算符@
,
所以你可以写
a = A @ B
而不是
a = numpy.dot(A,B)
答案 1 :(得分:31)
import numpy
result = numpy.dot( numpy.array(A)[:,0], B)
http://docs.scipy.org/doc/numpy/reference/
如果您想在没有numpy的情况下这样做,请尝试
sum( [a[i][0]*b[i] for i in range(len(b))] )
答案 2 :(得分:18)
我最喜欢的Pythonic dot产品是:
sum([i*j for (i, j) in zip(list1, list2)])
因此,对于您的情况,我们可以这样做:
sum([i*j for (i, j) in zip([K[0] for K in A], B)])
答案 3 :(得分:15)
from operator import mul
sum(map(mul, A, B))
答案 4 :(得分:4)
使用operator和itertools模块:
from operator import mul
from itertools import imap
sum(imap(mul, A, B))
答案 5 :(得分:2)
对于这种事情来说,最恐怖的方式可能就是使用numpy。 ; - )
答案 6 :(得分:1)
>>> X = [2,3,5,7,11]
>>> Y = [13,17,19,23,29]
>>> dot = lambda X, Y: sum(map(lambda x, y: x * y, X, Y))
>>> dot(X, Y)
652
就是这样。
答案 7 :(得分:0)
这可能是重复的解决方案,但是:
>>> u = [(1, 2, 3), (4, 5, 6)]
>>> v = [3, 7]
简单Python
:
>>> sum([x*y for (x, *x2), y in zip(u,v)])
31
或使用numpy
(如user57368的回答中所述):
import numpy as np
>>> np.dot(np.array(u)[:,0], v)
31
答案 8 :(得分:0)
使用more_itertools
,实现dotproduct
itertools recipe的第三方库:
import more_itertools as mit
a = [1, 2, 3]
b = [7, 8, 9]
mit.dotproduct(a, b)
# 50
答案 9 :(得分:0)
人们正在将 @ 运算符重新分配为点积运算符。这是我使用 vanilla python 的 zip 的代码,它返回一个元组。然后使用列表理解而不是映射。
def dot_product(a_vector,b_vector):
#a1 x b1 + a2 * b2..an*bn return scalar
return sum([an*bn for an,bn in zip(a_vector,b_vector)])
X = [2,3,5,7,11]
Y = [13,17,19,23,29]
print(dot_product(X,Y)) #652
a=[1,2,3]
b=[4,5,6]
print(dot_product(a,b)) #prints 32= 1*4 + 2*5 + 3*6 =
a = [1, 2, 3]
b = [7, 8, 9]
print(dot_product(a,b)) #prints 50