HOWTO · Python
Python で 2 つのリストの内積を計算する方法
組み込み、標準ライブラリ、サードパーティ、および NumPy のアプローチを用いて、Python で同じ長さの 2 つの数値リストの内積を計算する方法を学びます。
このページの内容
内積(スカラー積とも呼ばれます)は、同じ長さの 2 つの数値列の対応する値を乗算し、それらの積を合計します。たとえば、[2, 4, 6, 8, 10] と [10, 20, 30, 40, 50] の内積は 1100 です。以下の例では、Python でそれを計算する 4 つの方法を示します。入力を共有することでアプローチを比較しやすくしていますが、速度のベンチマークではありません。
リスト a と b について、計算は a[0] * b[0] + a[1] * b[1] + ... です。一方のリストの各位置は、もう一方の同じ位置の値とペアになります。例では整数を使用していますが、浮動小数点数を含む他の数値でも同じパターンが機能します。結果はペアごとの積のリストではなく、1 つのスカラー値です。
sum() 関数と zip() 関数を使用して Python で内積を計算する
zip() は 2 つのリストの対応する要素をペアにし、sum() が積を合計します。この組み込みアプローチは、リストの長さが同じ場合に簡潔な選択肢です。
num1 = [2, 4, 6, 8, 10]
num2 = [10, 20, 30, 40, 50]
result = sum(x * y for x, y in zip(num1, num2))
print(result)
1100
zip() は、短い方のイテラブルが終了した時点で停止します。長さが異なる場合、この式は対応しない値を計算から静かに除外します。まず長さが一致することを検証するか、対応しない値に対する別の方針を選んで文書化してください。
map() 関数と mul() 関数を使用して Python で内積を計算する
標準ライブラリの operator モジュールは、2 つの値を乗算する関数 mul() を提供します。組み込みの map() はそれを両方のリストの対応する値に適用し、sum() が積を合計します。
from operator import mul
num1 = [2, 4, 6, 8, 10]
num2 = [10, 20, 30, 40, 50]
result = sum(map(mul, num1, num2))
print(result)
最初の例と同様に、map() は最も短い入力イテラブルが終了した時点で停止します。対応しない値を破棄することが意図した動作でない場合は、まずリストの長さを確認してください。
more_itertools.dotproduct を使用して Python で内積を計算する
more_itertools はサードパーティのパッケージです。インポートする前に、ご使用の環境にインストールしてください。その dotproduct 関数は、ペアごとの積の合計を直接計算します。
try:
import more_itertools as mit
except ImportError:
class _Fallback:
@staticmethod
def dotproduct(left, right):
return sum(x * y for x, y in zip(left, right))
mit = _Fallback()
num1 = [2, 4, 6, 8, 10]
num2 = [10, 20, 30, 40, 50]
result = mit.dotproduct(num1, num2)
print(result)
more_itertools がインストールされている場合、これはその dotproduct 関数を呼び出します。ローカルのフォールバックにより、この例はオプションのパッケージがない環境でも実行可能に保たれ、ペアになった積の同じ合計を計算します。
1100
この操作には関数名 more_itertools.dotproduct を使用してください。他の例と同様に、すべての値に対応するペアがあるように、長さの一致するリストを指定してください。
NumPy を使用して Python で内積を計算する
手動の Python ループは、積を 1 ペアずつ累積するもう 1 つの方法です。
num1 = [2, 4, 6, 8, 10]
num2 = [10, 20, 30, 40, 50]
dot_product = 0
for x, y in zip(num1, num2):
dot_product += x * y
print("The dot product of the two lists is:", dot_product)
このループは zip() を使用しているため、短い方のリストで停止します。配列ベースの計算については、NumPy はリストを直接受け入れます。インポートする前に、ご使用の環境に NumPy をインストールしてください。
import numpy as np
num1 = [2, 4, 6, 8, 10]
num2 = [10, 20, 30, 40, 50]
result = np.dot(num1, num2)
print("The dot product of the two lists is:", result)
配列操作の詳細については、numpy.dot() 関数を参照してください。手動ループと NumPy の呼び出しは異なるアプローチです。周囲のコードと利用可能な依存関係に基づいて選択してください。