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 の呼び出しは異なるアプローチです。周囲のコードと利用可能な依存関係に基づいて選択してください。