什么是计算点积的pythonic方法?

xia*_*o 啸 28 python dot-product

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

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

我知道逻辑很简单,但如何用pythonic方式编写?

谢谢!

小智 41

Python 3.5有一个明确@的点积运算符,所以你可以写

a = A @ B
Run Code Online (Sandbox Code Playgroud)

代替

a = numpy.dot(A,B)
Run Code Online (Sandbox Code Playgroud)

  • @WalterTross `@` 是 Python 的,尽管它目前不使用它。Numpy 在其数组中实现它。 (5认同)
  • 实际上,“@”运算符是 Numpy 的而不是 Python 的 (4认同)
  • `@` 运算符专门用于矩阵乘法,因此 numpy 不会做任何事情:https://www.python.org/dev/peps/pep-0465/ (只是基础 Python 没有矩阵) (3认同)
  • 这篇文章听起来像“[1,2,3] @ [2,1,1]”应该有效,但事实并非如此。 (3认同)
  • 请参阅 /sf/ask/3181049371/ 了解警告 (2认同)

use*_*368 30

import numpy
result = numpy.dot( numpy.array(A)[:,0], B)
Run Code Online (Sandbox Code Playgroud)

http://docs.scipy.org/doc/numpy/reference/

如果你想在没有numpy的情况下这样做,试试吧

sum( [a[i][0]*b[i] for i in range(len(b))] )
Run Code Online (Sandbox Code Playgroud)


小智 21

我最喜欢的Pythonic dot产品是:

sum([i*j for (i, j) in zip(list1, list2)])
Run Code Online (Sandbox Code Playgroud)


所以对于你的情况我们可以这样做:

sum([i*j for (i, j) in zip([K[0] for K in A], B)])
Run Code Online (Sandbox Code Playgroud)

  • 在求和之前构建整个列表 (2认同)

Dmi*_*kov 16

from operator import mul

sum(map(mul, A, B))
Run Code Online (Sandbox Code Playgroud)