Pythonで行列の積を計算する関数
行列の積の計算についてはNumPyやSymPyモジュールに専用の関数がありますが、配列のプログラミングの練習をするために、いろいろ作成してみました。
行列を2次元のリストとして定義する方法
l_c(左側)を2行4列、l_d(右側)を4行3列の行列として配列を定義します。正方行列でない行列同士の掛け算は、l_c=2(左側の行列)の列数と、l_d=2(右側の行列)の行数が等しく、計算結果はl_c=2の行数×l_d=3の列数となります。
l_c = [[1, -1, 2, 1],
[2, 0 ,3, 1]]
l_d = [[2, 1, -1],
[-1, 1, 0],
[-2, 1, 3],
[0, 1, 1]]
l_mult=[]
for row in l_c:
l_temp=[]
for col in zip(*l_d):
elm=0
for row_nth,col_nth in zip(row,col):
elm+=row_nth*col_nth
l_temp.append(elm)
l_mult.append(l_temp)
l_mult
#[[-1, 3, 6], [-2, 6, 8]]
行列を2次元のリストとして定義する方法
NumPyモジュールではもっと簡単です。
import numpy as np
n_c = np.array([[1, -1, 2, 1],
[2, 0, 3, 1]])
n_d = np.array([[2, 1, -1],
[-1, 1, 0],
[-2, 1, 3],
[0, 1, 1]])
dim_r_c = n_c.shape[0]
dim_c_c = n_c.shape[1]
dim_r_d = n_d.shape[0]
dim_c_d = n_d.shape[1]
n_mult=np.empty((dim_r_c,dim_c_d))
for row in range(dim_r_c):
for col in range(dim_c_d):
n_mult[row,col ] = sum(n_c[row, :]*n_d[:, col])
n_mult
#array([[-1., 3., 6.],
[-2., 6., 8.]])
n_c[row, :]*n_d[:, col]で一気に計算することができます。この機能をNumPyのベクトル計算といいます。感動ものの機能です。
NumPyの演算子や関数で行列の積を計算する
演算子や関数を使って行列の積を計算します。
print(n_c@n_d)
print(np.dot(n_c,n_d))
どちらも同じ結果になります。
この記事が気に入ったらサポートをしてみませんか?