我有兩個列表,一個名爲A,另一個名爲B. A中的每個元素都是一個三元組,B中的每個元素都只是一個數字。我想計算定義爲:計算點積的pythonic方法是什麼?
result = A [0] [0] * B [0] + A [1] [0] * B [1] + ... + A [n- 1] [0] * B [n-1]
我知道邏輯很簡單,但是如何用pythonic寫?
謝謝!
我有兩個列表,一個名爲A,另一個名爲B. A中的每個元素都是一個三元組,B中的每個元素都只是一個數字。我想計算定義爲:計算點積的pythonic方法是什麼?
result = A [0] [0] * B [0] + A [1] [0] * B [1] + ... + A [n- 1] [0] * B [n-1]
我知道邏輯很簡單,但是如何用pythonic寫?
謝謝!
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))])
對於這種事情來說,最可能使用Pythonic的方法是使用numpy。 ;-)
我最喜歡的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)])
使用操作和迭代工具模塊:
from operator import mul
from itertools import imap
sum(imap(mul, A, B))
from operator import mul
sum(map(mul, A, B))
這可能是重複的解決方案,但是:
>>> 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
的Python 3.5擁有的點積明確的操作@
, 所以你可以寫
a = A @ B
,而不是
a = numpy.dot(A,B)
以上所有答案都是正確的,但在我看來最pythonic方法來計算點積爲:
>>> a=[1,2,3]
>>> b=[4,5,6]
>>> sum(map(lambda pair:pair[0]*pair[1],zip(a,b)))
32
>>> 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
就是這樣。
使用more_itertools
,實現第三方庫的dotproduct
itertools recipe:
import more_itertools as mit
a = [1, 2, 3]
b = [7, 8, 9]
mit.dotproduct(a, b)
# 50
的方式'A'的結構,這是一個二維表/矩陣。 – igaurav 2016-08-06 10:20:34