Python 行列乗算コード
依存関係を持たずに純粋な Python で行列の乗算を実行します。ネストされたループと最適化された構造の比較を実行します。
概要
行列の乗算は、線形代数、コンピューター グラフィックス、機械学習における基本的な数学演算です。これには、2 つの行列を取得し、行と列のドット積を計算して 3 番目の行列を生成することが含まれます。
行列 A と行列 B を乗算するには、A の列数が B の行数と等しくなければなりません。結果の行列は、A の行と B の列の次元を持ちます。
純粋な Python では、行列の乗算は 3 つのネストされたループを使用して実装されます。この O(n³) 操作は作成は簡単ですが遅いため、データ サイエンティストは運用環境でNumPyなどの特殊なライブラリ エンジンを使用します。
コードと実行の出力
ネストされたループとリスト内包表記を使用した純粋な Python の行列乗算。
matrix_mult.py
エディターで試してみる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` を実行できるようになりました。