転置行列
$m\times n$ の行列
\[A=\begin{bmatrix}a_{11}&a_{12} &\cdots &a_{1n}\\a_{21}&a_{22} &\cdots &a_{2n}\\\vdots & \vdots &\ddots &\vdots\\a_{m1}&a_{m2} &\cdots &a_{mn}\end{bmatrix}\]
について、$a_{ij}$ と $a_{ji}$ の位置を入れ替えた行列、すなわち主対角線 (左上から右下に伸びる対角線) で成分を折り返した行列
\[\begin{bmatrix}a_{11}&a_{21} &\cdots &a_{m1}\\a_{12}&a_{22} &\cdots &a_{m2}\\\vdots & \vdots &\ddots &\vdots\\a_{1n}&a_{2n} &\cdots &a_{mn}\end{bmatrix}\]
を $A$ の 転置行列 (transpose) と定義し、$^tA$ または $A^T$ のように表します。また、行列 $A$ の転置行列を得ることを「$A$ を転置する」と言います。
転置行列の性質
行列 $A$ の転置は線形操作です。
すなわち、任意の行列 $A,\ B$ とスカラー$k$ について
\[\begin{align*}&(A+B)^T=A^T+B^T\tag{1}\\[6pt]&(kA)^T=k(A^T)\tag{2}\end{align*}\]
が成り立ちます。$A$ の転置行列を再び転置すると $A$ を得ます。
\[(A^T)^T=A\tag{3}\]
行列積 $(AB)$ の転置は
\[(AB)^T=B^TA^T\tag{4}\]
で与えられます。$A$ の行列式 $\mathrm{det}A$ について、
\[\mathrm{det}A=\mathrm{det}(A^T)\tag{5}\]
が成り立ちます。逆行列の転置は転置行列の逆行列です:
\[(A^{-1})^T=(A^T)^{-1}\tag{6}\]
$A$ が $m\times n$ の行列であるとき、$AA^T$ は $m\times m$, $A^TA$ は $n\times n$ の正方対称行列となります (対称行列については記事の後半を参照してください)。たとえば、$A$ が $2\times 3$ の矩形行列
\[A=\begin{bmatrix}a&b&c\\d&e&f\end{bmatrix}\tag{7}\]
であるとき、$AA^T$ は $2\times 2$ の正方対称行列です。
\[AA^T=\begin{bmatrix}a&b&c\\d&e&f\end{bmatrix}\begin{bmatrix}a&d\\b&e\\c&f\end{bmatrix}=\begin{bmatrix}a^2+b^2+c^2&ad+be+cf\\ad+be+cf&d^2+c^2+f^2\end{bmatrix}\tag{8}\]
$A^TA$ は $3\times 3$ 正方対称行列です。
\[A^TA=\begin{bmatrix}a^2+d^2&ab+de&ac+df\\ab+de&b^2+e^2&bc+ef\\ac+df&bc+ef&c^2+f^2\end{bmatrix}\tag{9}\]
ndarray.T
NumPy で配列 (ndarray) を生成すると、自動的に転置配列もデータ属性として付与されます。転置配列は ndarray.T で参照します。
# ndarray_transpose
# In[1]
import numpy as np
# 乱数を初期化
np.random.seed(11)
# 要素を無作為に生成して4×4行列を定義
# [[1 2 8 2]
# [8 3 9 1]
# [1 5 3 2]
# [6 6 8 5]]
a = np.random.randint(1, 10, (4, 4))
# aの転置行列を表示
print(a.T)
# [[1 8 1 6]
# [2 3 5 6]
# [8 9 3 8]
# [2 1 2 5]]
numpy.transpose()
numpy.transpose() に行列 a を渡すと a の転置行列を返します。
# numpy_transpose
# In[1]
import numpy as np
# 乱数を初期化
np.random.seed(12)
# 要素を無作為に生成して3×5行列を定義
# [[7 2 3 4 4]
# [1 7 2 5 6]
# [3 7 1 6 9]]
a = np.random.randint(1, 10, (3, 5))
# aの転置行列
at = np.transpose(a)
print(at)
# [[7 1 3]
# [2 7 7]
# [3 2 1]
# [4 5 6]
# [4 6 9]]
対称行列
転置によって自身を変えない正方行列、すなわち
\[A^T=A\tag{10}\]
を満たす行列 $A$ を 対称行列 (symmetric matrix) といいます。対称行列は主対角線に関して折り返すと重なるような行列です。たとえば、$3$ 次対称行列は
\[\begin{bmatrix}d_1&a&b\\a&d_2&c\\b&c&d_3\end{bmatrix}\]
のように表せます。一般に対称行列の成分は $a_{ij}=a_{ji}$ という関係を満たしています。
対称行列の逆行列を転置すると
\[(A^{-1})^T=(A^T)^{-1}=A^{-1}\tag{11}\]
となるので、対称行列の逆行列もまた対称行列です。NumPy で $4$ 次正方行列の逆行列を計算して確認してみましょう。
# numpy_symmetric_matrix
# In[1]
import numpy as np
np.set_printoptions(precision=3)
# 4次正方行列
a = np.array([[1, 3, 7, 2],
[3, 0, 5, 8],
[7, 5, 1, 4],
[2, 8, 4, 4]])
# aの逆行列
ai = np.linalg.inv(a)
print(ai)
# [[ 0.09 -0.042 0.192 -0.154]
# [-0.042 -0.058 -0.012 0.148]
# [ 0.192 -0.012 -0.002 -0.07 ]
# [-0.154 0.148 -0.07 0.102]]
任意の行列 $X$ について、
\[(X^TX)^T=X^T(X^T)^T=X^TX\tag{12}\]
が成り立つので、$X^TX$ および $XX^T$ は対称行列となります。$X$ は正方行列でなくても構いません。たとえば
\[X=\begin{bmatrix}
a&b&c\\d&e&f\end{bmatrix}\tag{13}\]
とした場合、$XX^T$ と $X^TX$ は異なるサイズの行列ですが、どちらも対称行列となります。
\[XX^T=\begin{bmatrix}a^2+b^2+c^2&ad+be+cf\\ad+be+cf&a^2+b^2+c^2\end{bmatrix}\tag{14}\]
\[X^TX=\begin{bmatrix}a^2+d^2&ab+de&ac+df\\ab+de&b^2+e^2&bc+ef\\ac+df&bc+ef&c^2+f^2\end{bmatrix}\tag{15}\]
下記は誤植と思われますので、ご確認ください。
転置行列の定義の最右下の要素で、a_nm → a_mn
(1)式で、A+B^T → (A+B)^T
(10)式で、A^T=T → A^T=A
(10)式の下の行で、主対線 → 主対角線
ありがとうございます。
本当に助かります。
ご指摘いただいた箇所はすべて訂正しておきました。
また何か見つけたらよろしくお願いします m(_ _)m
【ChatGPT解説】numpy.transposeで行列を転置する
生徒: 先生、転置行列って何ですか? 転置とはどういう意味なのでしょうか?
先生: いい質問です。転置行列は元の行列の行と列を入れ替えた行列のことです。つまり、元の行列の要素を軸として対称に配置し直した行列です。
生徒: なるほど、行と列を入れ替えることで転置行列を作るんですね。転置行列を求める具体的な手順はどうなりますか?
先生: 転置行列を求める手順は非常に簡単です。行列の各要素の位置を入れ替えるだけです。たとえば、元の行列AがNxMの行列であれば、転置行列A^TはMxNの行列になります。Aの(i, j)要素がA^Tの(j, i)要素となるように要素の位置を入れ替えます。
生徒: 分かりました。要素の位置を入れ替えることで転置行列を作るんですね。でも、転置行列を使うことにはどんな利点があるんですか?
先生: 転置行列にはいくつかの利点があります。一つは行列の性質を簡単に表現できる点です。たとえば、転置行列の転置は元の行列と一致します。また、転置行列の足し算やスカラー倍は、元の行列と同じルールで計算できます。
生徒: なるほど、転置行列の転置は元の行列と同じなんですね。それで、転置行列を使う具体的な応用はありますか?
先生: はい、転置行列にはいくつかの応用があります。一つは行列の積や方程式の解を求める際に使われます。また、転置行列はベクトルの内積やノルムの計算にも利用されます。さらに、最小二乗法や行列の対角化、行列の正則性の判定など、さまざまな数学的な操作や応用で使われます。
生徒: なるほど、転置行列は行列の性質を表現するために使われたり、行列の積や方程式の解を求める際に利用されるんですね。興味深いです。もっと転置行列について学んでみたいです。
生徒: 先生、numpy.transposeとは何ですか? 具体的にどのように使われるのでしょうか?
先生: いい質問です。numpy.transposeはNumPyというPythonの数値計算ライブラリで提供されている関数で、行列の転置を行うための機能です。行列や配列を転置することで、行と列を入れ替えることができます。
生徒: なるほど、numpy.transposeは行列や配列の転置をするための機能なんですね。具体的な使い方を教えていただけますか?
先生: もちろんです。numpy.transposeはNumPyの配列オブジェクトに対して使用します。以下に簡単な例を示します。
◆◆◆◆◆
import numpy as np
arr = np.array([[1, 2, 3],[4, 5, 6]])
transposed_arr = np.transpose(arr)
print(transposed_arr)
◆◆◆◆◆
この例では、元の配列arrをnp.transposeを使って転置しています。出力結果は以下のようになります。
◆◆◆◆◆
[[1 4]
[2 5]
[3 6]]
◆◆◆◆◆
生徒: 分かりました。np.transposeを使って行列を転置することができますね。他にもnumpy.transposeの使い方には制約はありますか?
先生: numpy.transpose関数にはいくつかのオプションもあります。たとえば、axesパラメータを使って特定の軸の順序を指定することもできます。また、多次元の配列に対しても使うことができます。NumPyの公式ドキュメントやチュートリアルにはさまざまな使い方の例が掲載されていますので、ぜひ参考にしてください。
生徒: 分かりました。np.transposeにはオプションもあり、軸の順序を指定することもできるんですね。ドキュメントやチュートリアルを参考に、さらに使い方を学んでみたいと思います。ありがとうございました。
先生: どういたしまして。NumPyのnp.transposeは行列の転置を簡単に行うための便利な機能ですので、ぜひ活用してください。もしご不明な点や追加の質問があれば、いつでもお聞きください。