计算点积的 Pythonic 方法是什么?
我有两个列表,一个叫做A,另一个叫做B。A里的每个元素都是三个数字组成的三元组,而B里的每个元素只是一个数字。我想计算一个结果,定义如下:
result = A[0][0] * B[0] + A[1][0] * B[1] + ... + A[n-1][0] * B[n-1]
我知道这个逻辑很简单,但怎么用Python的方式来写呢?
谢谢!
12 个回答
32
我最喜欢的Python风格的点积计算方法是:
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)])
80
Python 3.5 引入了一个专门的符号 @
来表示点积运算,
a = A @ B
这样你就可以用这个符号来写点积,而不需要用其他复杂的方式。
a = numpy.dot(A,B)
44
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))] )