Pythonで2つの行列を乗算する方法を徹底解説
この記事では、次の問題に対する解決策を詳しく解説します。
問題文: 2つの行列が与えられたとき、それらを乗算し、その結果を出力します。
2つの行列の乗算が成立するためには、1つ目の行列の列数が2つ目の行列の行数と一致している必要があります。この条件が満たされている場合にのみ、乗算の計算を実行できます。
例えば、Aが m×n の行列、Bが n×p の行列であるとき、積 A×B は m×p の行列になります。それでは、具体的な実装方法を見ていきましょう。
アプローチ1:総当たり(ブルートフォース)法
最も基本的な方法は、三重のforループを使って各要素を順番に計算する方法です。外側のループで行を、中間のループで列を走査し、内側のループで対応する要素同士の積の総和を求めます。時間計算量は O(n³) となります。
サンプルコード
A = [[1, 2, 3], [4, 5, 6], [7, 8, 9] ] B = [[5, 3, 3], [6, 5, 4], [0, 2, 0] ] result= [[0, 0, 0], [0, 0, 0], [0, 0, 0] ] # 行ごとに繰り返し処理 for i in range(len(A)): # 列ごとに繰り返し処理 for j in range(len(B[0])): # 積和の計算 for k in range(len(B)): result[i][j] += A[i][k] * B[k][j] for ele in result: print(ele)
出力結果
[17, 19, 11] [50, 49, 32] [83, 79, 53]
アプローチ2:zip関数を使う方法
Pythonの組み込み関数 zip を活用すると、より簡潔に記述できます。zip(*B) によって行列Bを転置し、Aの各行とBの各列の要素同士の積の総和を求めることで、リスト内包表記だけで行列の積を計算できます。
サンプルコード
A = [[1, 2, 3], [4, 5, 6], [7, 8, 9] ] B = [[5, 3, 3], [6, 5, 4], [0, 2, 0] ] # 組み込みのzip関数を使用 result = [[sum(a * b for a, b in zip(A_row, B_col)) for B_col in zip(*B)] for A_row in A] for ele in result: print(ele)
出力結果
[17, 19, 11] [50, 49, 32] [83, 79, 53]
補足:NumPyを使う実践的な方法
実際の開発やデータ分析の現場では、数値計算ライブラリ「NumPy」を使うのが一般的です。np.dot() 関数や @ 演算子を使えば、高速かつ可読性の高いコードで行列演算が行えます。
サンプルコード
import numpy as np A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) B = np.array([[5, 3, 3], [6, 5, 4], [0, 2, 0]]) result = np.dot(A, B) print(result)
出力結果
[[17 19 11] [50 49 32] [83 79 53]]
まとめ
この記事では、Pythonで2つの行列を乗算する3つの方法を学びました。三重ループによる素朴な実装は仕組みの理解に最適で、zip関数を使った方法は純粋なPythonだけで簡潔に書けるのが魅力です。さらに、大規模な数値計算や実務用途ではNumPyを活用することで、パフォーマンスと保守性の両立が可能になります。目的に応じて適切な手法を選択しましょう。
-
PythonとTensorFlowで2つの行列を乗算する方法を解説
TensorFlowは、Googleが提供する機械学習フレームワークです。オープンソースとして公開されており、Pythonと組み合わせてアルゴリズムやディープラーニングアプリケーションなどを実装するために利用されています。研究用途から本番運用まで幅広く使われており、複雑な数学的演算を高速に処理できる最適化技術を備えているのが特長です。 その理由の一つは、NumPyと多次元配列を基盤としている点にあります。この多次元配列は「テンソル」と呼ばれます。TensorFlowは深層ニューラルネットワークの構築をサポートし、高いスケーラビリティを持ち、人気のデータセットが多数付属しています。また、GPUに
-
Pythonで2つの数値を加算するプログラム:ビット演算による実装方法
この記事では、2つの数値を加算するという問題に対する解法とアプローチについて詳しく解説します。 問題の概要 2つの大きな数値が与えられ、それらを加算した結果を出力することが求められます。 最も単純なアプローチは、オペランド同士を「+」演算子で結ぶ方法です。また、2つの数値をリストなどのイテラブルに格納し、Python標準ライブラリに用意されている組み込み関数 sum() を利用する方法もあります。 しかし、これらのアプローチでは10進数に対して直接演算を行うため、計算コストが増大するという課題があります。 ビット演算を用いた別のアプローチ そこで次に、数値をビット単位で操作する別のアプローチを