ユーニックス総合研究所

  • home
  • archives
  • python-matrix

Pythonのリストを使った行列とその技法【回転、反転】

  • 作成日: 2023-06-29
  • 更新日: 2023-12-24
  • カテゴリ: Python

Pythonのリストを使った行列

Pythonのリストを使って行列を定義するには以下のようなコードを書きます。

matrix = [  
    [1, 2, 3, 4],  
    [2, 2, 3, 4],  
    [3, 2, 3, 4],  
    [4, 2, 3, 4],  
]  

上記の行列matrix4x4の正方行列です。
リストを使えばこのような行列を定義することができます。

この記事ではPythonのリストを使った行列とその技法について解説します。

関連記事
Djangoでオブジェクトを一括作成・更新【bulk_create, bulk_update】
DjangoのModel.objects.filter()の使い方【QuerySet】
Djangoのmodelのcreate()の使い方【Python】
Django入門: ルートの設定 ~ 簡単な一行掲示板アプリを作る その4【Windows10】
NumPyのappend()の使い方: 配列の末尾に要素を追加
Numpyのarangeの使い方: 指定範囲の数列を生成する
Python3でYoutube Data APIを使ってキーワード検索する
PythonからC言語(my.puts)を呼び出して実行する

行列の生成

for文などを使って行列を生成する方法です。
行列の高さと横幅が決まっている場合は入れ子のfor文で行列を生成できます。
以下のようにです。

width = 4  # 行列の横幅  
height = 3  # 行列の高さ  
matrix = []  

for y in range(height):  
    row = []  # 行  
    for x in range(width):  
        row.append(x)  
    matrix.append(row)  

print(matrix)  
# [[0, 1, 2, 3], [1, 2, 3, 4], [2, 3, 4, 5]]  

行列の出力

行列の要素を出力するにも入れ子のfor文を使います。
以下のようなコードを書きます。

matrix = [  
    [1, 2, 3, 4],  
    [2, 2, 3, 4],  
    [3, 2, 3, 4],  
    [4, 2, 3, 4],  
]  

for row in matrix:  
    for col in row:  
        print(col, end=' ')  
    print()  
# 1 2 3 4  
# 2 2 3 4  
# 3 2 3 4  
# 4 2 3 4  

matrixをfor文で回すと行(row)が取り出せます。
そしてその行を再びfor文で回すと要素が取り出せます。
行のcolを出力したらprint()で改行を1つ入れます。
こうすると上記のような出力になります。

正方行列の右回転

正方行列を右回転するには以下のようなコードを書きます。

src = [  
    [1, 0, 0, 0],  
    [1, 0, 0, 0],  
    [1, 0, 0, 0],  
    [1, 1, 1, 1],  
]  

dst = [  
    [0, 0, 0, 0],  
    [0, 0, 0, 0],  
    [0, 0, 0, 0],  
    [0, 0, 0, 0],  
]  


def rotate_matrix(dst, src):  
    """行列の右回転"""  
    for y in range(4):  
        for x in range(4):  
            dst[y][3 - x] = src[x][y]  


def show_matrix(m):  
    """行列の表示"""  
    for row in m:  
        for col in row:  
            print(col, end=' ')  
        print()  


rotate_matrix(dst, src)  

print('Before')  
show_matrix(src)  

print('\nAfter')  
show_matrix(dst)  

実行結果は以下です。

Before  
1 0 0 0  
1 0 0 0  
1 0 0 0  
1 1 1 1  

After  
1 1 1 1  
1 0 0 0  
1 0 0 0  
1 0 0 0  

行列の転写は行列の添え字を工夫すると実現できます。
これを理解するにはどのインデックスがどのインデックスに転写されるかをインデックスの対応表を書いて行うとわかりやすいです。

正方行列の左回転

正方行列を左回転するには以下のようなコードを書きます。

src = [  
    [1, 0, 0, 0],  
    [1, 0, 0, 0],  
    [1, 0, 0, 0],  
    [1, 1, 1, 1],  
]  

dst = [  
    [0, 0, 0, 0],  
    [0, 0, 0, 0],  
    [0, 0, 0, 0],  
    [0, 0, 0, 0],  
]  


def rotate_matrix(dst, src):  
    """行列の左回転"""  
    for y in range(4):  
        for x in range(4):  
            dst[x][y] = src[y][3 - x]  


def show_matrix(m):  
    """行列の表示"""  
    for row in m:  
        for col in row:  
            print(col, end=' ')  
        print()  


rotate_matrix(dst, src)  

print('Before')  
show_matrix(src)  

print('\nAfter')  
show_matrix(dst)  

出力結果は以下です。

Before  
1 0 0 0  
1 0 0 0  
1 0 0 0  
1 1 1 1  

After  
0 0 0 1  
0 0 0 1  
0 0 0 1  
1 1 1 1  

正方行列の上下反転

正方行列の上下反転は以下のようなコードを書きます。

src = [  
    [1, 0, 0, 1],  
    [1, 0, 0, 0],  
    [1, 0, 0, 0],  
    [1, 1, 1, 1],  
]  

dst = [  
    [0, 0, 0, 0],  
    [0, 0, 0, 0],  
    [0, 0, 0, 0],  
    [0, 0, 0, 0],  
]  


def jouge_hanten(dst, src):  
    """行列の上下反転"""  
    for y in range(4):  
        for x in range(4):  
            dst[3 - y][x] = src[y][x]  


def show_matrix(m):  
    """行列の表示"""  
    for row in m:  
        for col in row:  
            print(col, end=' ')  
        print()  


jouge_hanten(dst, src)  

print('Before')  
show_matrix(src)  

print('\nAfter')  
show_matrix(dst)  

出力結果は以下です。

Before  
1 0 0 1  
1 0 0 0  
1 0 0 0  
1 1 1 1  

After  
1 1 1 1  
1 0 0 0  
1 0 0 0  
1 0 0 1  

正方行列の左右反転

正方行列の左右反転は以下のようなコードを書きます。

src = [  
    [1, 0, 0, 1],  
    [1, 0, 0, 0],  
    [1, 0, 0, 0],  
    [1, 1, 1, 1],  
]  

dst = [  
    [0, 0, 0, 0],  
    [0, 0, 0, 0],  
    [0, 0, 0, 0],  
    [0, 0, 0, 0],  
]  


def sayu_hanten(dst, src):  
    """行列の左右反転"""  
    for y in range(4):  
        for x in range(4):  
            dst[y][3 - x] = src[y][x]  


def show_matrix(m):  
    """行列の表示"""  
    for row in m:  
        for col in row:  
            print(col, end=' ')  
        print()  


sayu_hanten(dst, src)  

print('Before')  
show_matrix(src)  

print('\nAfter')  
show_matrix(dst)  

出力結果は以下です。

Before  
1 0 0 1  
1 0 0 0  
1 0 0 0  
1 1 1 1  

After  
1 0 0 1  
0 0 0 1  
0 0 0 1  
1 1 1 1  

おわりに

今回はPythonでリストを使った行列を解説しました。
なにか参考になれば幸いです。

🦝 < 行列回転!

🦝 < まわるまわる