Python 行列乗算コード

依存関係を持たずに純粋な Python で行列の乗算を実行します。ネストされたループと最適化された構造の比較を実行します。

エディターで試してみる

概要

行列の乗算は、線形代数、コンピューター グラフィックス、機械学習における基本的な数学演算です。これには、2 つの行列を取得し、行と列のドット積を計算して 3 番目の行列を生成することが含まれます。

行列 A と行列 B を乗算するには、A の列数が B の行数と等しくなければなりません。結果の行列は、A の行と B の列の次元を持ちます。

純粋な Python では、行列の乗算は 3 つのネストされたループを使用して実装されます。この O(n³) 操作は作成は簡単ですが遅いため、データ サイエンティストは運用環境でNumPyなどの特殊なライブラリ エンジンを使用します。

コードと実行の出力

ネストされたループとリスト内包表記を使用した純粋な Python の行列乗算。

def multiply_matrices(A, B):
    rows_A = len(A)
    cols_A = len(A[0])
    rows_B = len(B)
    cols_B = len(B[0])
    
    if cols_A != rows_B:
        raise ValueError("Cannot multiply: column size of A must match row size of B.")
        
    # Initialize result matrix with zeros
    result = [[0 for _ in range(cols_B)] for _ in range(rows_A)]
    
    # Iterate through rows of A
    for i in range(rows_A):
        # Iterate through columns of B
        for j in range(cols_B):
            # Iterate through rows of B (or columns of A)
            for k in range(cols_A):
                result[i][j] += A[i][k] * B[k][j]
                
    return result

# 2x3 Matrix A
matrix_A = [
    [1, 2, 3],
    [4, 5, 6]
]

# 3x2 Matrix B
matrix_B = [
    [7, 8],
    [9, 10],
    [11, 12]
]

print("Matrix A (2x3):", matrix_A)
print("Matrix B (3x2):", matrix_B)
res = multiply_matrices(matrix_A, matrix_B)
print("Product (2x2):", res)
端子出力
Matrix A (2x3): [[1, 2, 3], [4, 5, 6]]
Matrix B (3x2): [[7, 8], [9, 10], [11, 12]]
Product (2x2): [[58, 64], [139, 154]]

段階的な実装

  • 数学的グラフィックスのレンダリングと座標回転
  • 単純な人工ニューラル ネットワーク層のドット積
  • アルゴリズム構造と入れ子になったループを理解する

よくある質問

NumPyはなぜ行列の乗算をこれほど高速に実行するのでしょうか?

NumPyは C で書かれており、高度に最適化された BLAS/LAPACK ライブラリを利用します。標準の Python ループでは実行できない、ベクトル化、CPU キャッシュの最適化、並列実行を利用します。

Python の `@` 演算子とは何ですか?

Python 3.5 以降、行列乗算専用の中置演算子として `@` 記号が導入され、numpy 配列を使用するときに `A @ B` を実行できるようになりました。

関連トピック