37

我有两个列表,一个名为 A,另一个名为 B。A 中的每个元素都是三元组,B 中的每个元素只是一个数字。我想计算定义为的结果:

结果 = A[0][0] * B[0] + A[1][0] * B[1] + ... + A[n-1][0] * B[n-1]

我知道逻辑很简单,但是如何以 Python 的方式编写呢?

谢谢!

4

11 回答 11

72

Python 3.5 有一个@用于点积的显式运算符,因此您可以编写

a = A @ B

代替

a = numpy.dot(A,B)
于 2016-09-23T14:00:46.463 回答
40
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))] )
于 2011-05-07T06:37:56.873 回答
29

我最喜欢的 Pythonic 点积是:

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)])
于 2015-01-10T17:37:12.707 回答
23
from operator import mul

sum(map(mul, A, B))
于 2016-03-10T16:02:06.350 回答
4

使用 operator 和 itertools 模块:

from operator import mul
from itertools import imap

sum(imap(mul, A, B))
于 2015-08-12T16:17:17.593 回答
3

使用实现itertools 配方more_itertools的第三方库:dotproduct

import more_itertools as mit


a = [1, 2, 3]
b = [7, 8, 9]

mit.dotproduct(a, b)
# 50
于 2017-08-28T20:42:28.720 回答
2
>>> 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

就是这样。

于 2017-01-11T02:05:01.430 回答
1

对于这种事情,最 Pythonic 的方式可能是使用numpy。;-)

于 2011-05-07T06:36:47.307 回答
1

人们正在将 @ 运算符重新分配为点积运算符。这是我使用 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 
于 2021-04-04T18:45:42.257 回答
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
于 2016-07-31T06:33:08.597 回答
0

以上所有答案都是正确的,但在我看来,计算点积最pythonic的方法是:

>>> a=[1,2,3]
>>> b=[4,5,6]
>>> sum(map(lambda pair:pair[0]*pair[1],zip(a,b)))
32
于 2016-12-04T01:34:53.037 回答