Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで行列の転置を求める方法をわかりやすく解説

本記事では、Pythonを使って行列の転置(transpose)を求める方法について、2つのアプローチを交えながら詳しく解説します。

問題の概要

問題設定: 与えられた行列に対して、その転置行列を求めて表示します。

行列の転置とは、行列Aの要素 A[i][j]A[j][i] と入れ替えることで得られる行列のことです。つまり、行と列を入れ替えた新しい行列が転置行列となります。

それでは、実際のコード実装を見ながら概念を確認していきましょう。

方法1:新しい行列を作成して転置を格納する

1つ目の方法は、入力行列とは別に新しい行列を用意し、そこに転置結果を格納するアプローチです。元の行列を保持したい場合に有効な方法です。

サンプルコード

def transpose(A, B):
    for i in range(M):
        for j in range(N):
            B[i][j] = A[j][i]

# ドライバーコード
M = N = 4
A = [[0, 1, 1, 0],
     [0, 2, 0, 2],
     [0, 3, 0, 3],
     [0, 0, 4, 4]]
B = A[:][:]  # 空の行列

transpose(A, B)

print("変換後の行列は")
for i in range(N):
    for j in range(N):
        print(B[i][j], " ", end='')
    print()

実行結果

変換後の行列は
0 0 0 0 
0 2 3 0 
0 3 0 4 
0 0 4 4 

このコードでは、二重ループを使って元の行列Aの各要素を読み込み、行と列を入れ替えた位置に新しい行列Bへコピーしています。計算量は O(M×N) となり、追加のメモリとして M×N 分の領域が必要です。

方法2:入力行列自体に転置を上書きする(インプレース転置)

2つ目の方法は、新しい行列を作らずに入力行列そのものを書き換えるアプローチです。j > i の範囲だけをループ処理することで、同じ要素を二重に交換してしまうことを防いでいます。メモリ効率が良いのが特徴です。

サンプルコード

# 関数定義
def transpose(A):
    for i in range(M):
        for j in range(i + 1, N):
            A[i][j], A[j][i] = A[j][i], A[i][j]

M = N = 4
A = [[0, 1, 1, 0],
     [0, 2, 0, 2],
     [0, 3, 0, 3],
     [0, 0, 4, 4]]

transpose(A)

print("変換後の行列は")
for i in range(M):
    for j in range(N):
        print(A[i][j], " ", end='')
    print()

実行結果

変換後の行列は
0 0 0 0 
0 2 3 0 
0 3 0 4 
0 0 4 4 

Pythonのタプル代入(A[i][j], A[j][i] = A[j][i], A[i][j])を活用することで、一時変数なしで要素をスワップできる点もポイントです。なお、この方法は正方行列(M=N)でのみ正しく動作することに注意してください。

補足:zip()を使った簡潔な書き方

Pythonでは、組み込み関数 zip() を使うことで、転置を1行で実現できます。

transposed = [list(row) for row in zip(*A)]

*A で行列の各行を展開し、zip() がそれらを列ごとにまとめ直す仕組みです。NumPyを使用している場合は A.Tnp.transpose(A) でも同様の結果が得られます。

まとめ

本記事では、Pythonで行列の転置を求める2つの基本的な方法を学びました。

  • 方法1: 新しい行列を作成する方式 ― 元の行列を保持でき、長方形行列にも対応可能
  • 方法2: 入力行列を直接書き換える方式 ― メモリ効率が良いが、正方行列限定

用途に応じて適切な方法を選択しましょう。また、実務では zip(*A) やNumPyの .T 属性を使うと、より簡潔かつ高速に転置を実現できます。

  1. Pythonで行列の転置を求めるプログラム

    この記事では、与えられた問題に対する解法とアプローチについて詳しく解説します。 問題文 ある行列が与えられたとき、その転置を同じ行列に格納し、結果を表示する必要があります。 行列の転置とは、行を列に、列を行に入れ替えたものです。言い換えれば、行列Aの転置は、要素A[i][j]をA[j][i]と入れ替えることで得られます。 実装例 N = 4 def transpose(A): for i in range(N): for j in range(i+1, N): A[i][j], A[j][i] = A[j][i], A[i][j] # ドライ

  2. Pythonで配列(リスト)の合計を求める方法をわかりやすく解説

    この記事では、配列(リスト)の合計値を求めるという問題に対して、Pythonでの解決策とアプローチをわかりやすく解説します。 問題の定義 配列が入力として与えられたとき、その配列に含まれるすべての要素の合計を計算することを目標とします。 例えば、[1, 2, 3, 4, 5] という配列が与えられた場合、出力は 15 になります。 アプローチ1:ループを使った素朴な方法(総当たり法) 最も基本的な方法は、リストを先頭から順に走査し、各要素を合計用の変数に加算していくやり方です。手順は以下の通りです。 合計を格納する変数を 0 で初期化します。 for ループでリストの各要素を取り出し、順番に