web-dev-qa-db-ja.com

ドット積を計算するPythonicの方法は何ですか?

2つのリストがあり、1つはA、もう1つはBという名前です。Aの各要素はトリプルであり、Bの各要素は単なる数字です。次のように定義された結果を計算したい:

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

ロジックは簡単ですが、Pythonの方法で書く方法は知っていますか?

ありがとう!

27
xiao 啸
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))] )
30
user57368

Python 3.5には、ドット積の明示的な演算子@があります。

a = A @ B

の代わりに

a = numpy.dot(A,B)
36
Henri Andre

私のお気に入りの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)])
18
greggomann
from operator import mul

sum(map(mul, A, B))
15
Dmitry Zotikov

オペレーターとitertoolsモジュールの使用:

from operator import mul
from itertools import imap

sum(imap(mul, A, B))
4
NachoGomez

おそらく、この種のことに対する最もPython的な方法は、 numpy を使用することです。 ;-)

2
Keith
>>> 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

以上です。

1
qezt

ただし、これはソリューションの繰り返しになる場合があります。

>>> u = [(1, 2, 3), (4, 5, 6)]
>>> v = [3, 7]

プレーンPython

>>> sum([x*y for (x, *x2), y in Zip(u,v)])
31

またはnumpyを使用して( ser57368 の答えで説明されているように):

import numpy as np
>>> np.dot(np.array(u)[:,0], v)
31
0
Aziz Alto

上記の答えはすべて正しいですが、私の意見では、ドット積を計算する最もPython的な方法は次のとおりです。

>>> a=[1,2,3]
>>> b=[4,5,6]
>>> sum(map(lambda pair:pair[0]*pair[1],Zip(a,b)))
32
0
valenta

more_itertoolsdotproductを実装するサードパーティライブラリ itertoolsレシピ

import more_itertools as mit


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

mit.dotproduct(a, b)
# 50
0
pylang