見出し画像

Pythonで行列の積を計算する関数

行列の積の計算についてはNumPyやSymPyモジュールに専用の関数がありますが、配列のプログラミングの練習をするために、いろいろ作成してみました。

Pythonde行列の積を計算する

行列を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))

どちらも同じ結果になります。


この記事が気に入ったらサポートをしてみませんか?