見出し画像

リスト内包表記で行列の積を計算する

行列の積を計算するために、通常はfor文を何回も回していく必要がありますが、リスト内包表記を使って1行で計算できるような関数を作ってみました。

詳しくは、Pythonで行列の積を計算する

行列の定義

3×3の正方行列としてl_a、l_b、2×4の行列としてl_c、4×2の行列としてl_dを定義します。

l_a = [[1, -1, 2],
      [2, -2 ,1],
      [3, 1 ,-1]]
l_b = [[2, 1, 3],
      [1, 1, 2],
      [-1, 2, 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]]

zip関数を使った行列の積の計算

def mult(left,right):
   l_mult=[]
   for row in left:
       l_temp=[]
       for col in zip(*right):
           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)
   return l_mult

print(mult(l_a,l_b))
print(mult(l_c,l_d))

2次元の配列で行を取り出すのは簡単ですが、列を取り出すときには5行目のようにzip関数を使い配列をアンパックするなどの工夫が必要がです。ここまでできればリスト内包表記もできそうな気がします。

リスト内包表記による行列の積の計算

いろいろ試行錯誤しながら作ってみました。

def mult_com(left,right):
   return [[sum([row*col for row,col in zip(rows, cols) ]) \
            for cols in zip(*right)] for rows in left]

print(mult_com(l_a,l_b))
print(mult_com(l_c,l_d))

#[[-1, 4, 7], [1, 2, 5], [8, 2, 8]]
#[[-1, 3, 6], [-2, 6, 8]]

少し長くなり、標記上\で区切って2行に分かれていますが、実質的には1行で計算することができました。


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