【Python】Numpyにおける軸の概念~2次元配列と3次元配列と転置行列~
IT技術
Numpyにおける軸の概念
機械学習の分野では、行列の操作がよく出てきます。
PythonのNumpyという外部ライブラリが扱う配列には、便利な機能が多く備わっており、機械学習の実装でもこれらの機能をよく使います。
Numpyの配列機能は、慣れれば大きな効果を発揮しますが、多少クセがあるのも事実です。
特に、Numpyでの軸の考え方は、初心者にはわかりづらい部分かと思います。
私も初心者の際に、理解するのに苦労しました。
この記事では、Numpyにおける軸の概念について詳しく解説していきたいと思います!
2次元配列
軸とは何か
Numpyにおける軸とは、配列内の数値が並ぶ方向のことです。
そのため当然ですが、2次元配列には2つ、3次元配列には3つ、軸があることになります。
2次元配列
例えば、以下のような 2×3 の、2次元配列を考えてみることにしましょう。
1import numpy as np
2a = np.array([[0,1,2],[3,4,5]])
3#2×3の2次元配列
4print(a)
[[0 1 2]
[3 4 5]]
軸の向きはインデックスで表します。
上の2次元配列の場合、axis=0 が縦方向を表し、axis=1 が横方向を表します。
2次元配列の軸
3次元配列
次に、以下のような 2×3×4 の3次元配列を考えてみます。
1import numpy as np
2
3b = np.array([[[0,1,2,3],[4,5,6,7],[8,9,10,11]],
4 [[12,13,14,15],[16,17,18,19],[20,21,22,23]]])
5#2×3×4の3次元配列です
6print(b)
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
上の3次元配列の場合、axis=0 が奥行き、axis=1 が縦方向、axis=2 が横方向を表すようになります。
個人的な感覚では、2次元配列と同じように、axis=0が縦方向、axis=1が横方向を表し、新たに追加されたaxis=2で奥行き方向を表してくれた方がわかりやすい気もします。
ですが、なぜか Numpy ではそう定義されていません。
この辺りが初心者の方にはわかりづらい部分ですが、少しずつNumpyでの表現方法に慣れていきましょう。
3次元配列の軸
転置行列とは何か
機械学習の分野では、Numpyにおいて配列の中の値を組み替えるtransposeメソッドというメソッドをよく使います。
transposeメソッドの使い方について説明する前に、ここで転置行列とは何かを簡単に説明しておきます。
転置行列の定義
m行n列の行列Aに対してAの(i,j)成分と(j,i)成分を入れ替えたm行n列の行列をAの転置行列と呼ぶ。
この説明だけだと少しわかりづらいですね。
例えば、先ほどの2次元配列で考えて見ましょう。
1import numpy as np
2a = np.array([[0,1,2],[3,4,5]])
3#2×3の2次元配列
4print(a)
[[0 1 2]
[3 4 5]]
転換してみる
この行列を転置してみると、以下のようになります。
具体的には、(2,3)成分である「5」が(3,2)成分に移動しているのが確認できます。
他の成分に関しても同様のことが言えます。
このようにして、Aの(i,j)成分と(j,i)成分が、すべて入れ替わったのが転置行列です。
1import numpy as np
2
3a = np.array([[0,1,2],[3,4,5]])
4
5#aの転置行列を出力。a.Tは2×2の2次元配列。
6print(a.T)
[[0 3]
[1 4]
[2 5]]
2次元配列については比較的、理解しやすいと思います。
しかし、転置行列は2次元以上に拡張して考えることもできます。
3次元配列の場合
3次元配列の場合には、(i,j,k)成分が(k,j,i)成分に移動します。
こちらも文字だけだとイメージが湧きにくいと思うので、先ほどの3次元配列を例に考えてみます。
1import numpy as np
2
3b = np.array([[[0,1,2,3],[4,5,6,7],[8,9,10,11]],
4 [[12,13,14,15],[16,17,18,19],[20,21,22,23]]])
5#2×3×4の3次元配列です
6print(b)
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
転換してみる
これを転置すると以下のようになります。
1import numpy as np
2
3b = np.array([[[0,1,2,3],[4,5,6,7],[8,9,10,11]],
4 [[12,13,14,15],[16,17,18,19],[20,21,22,23]]])
5
6#bの転置行列を出力。bは4×3×2の3次元配列。
7print(b.T)
[[[ 0 12]
[ 4 16]
[ 8 20]]
[[ 1 13]
[ 5 17]
[ 9 21]]
[[ 2 14]
[ 6 18]
[10 22]]
[[ 3 15]
[ 7 19]
[11 23]]]
まず、形式については、2×3×4の配列が、4×3×2の行列になっているのがわかるかと思います。
次に成分の入れ替わり方について、先ほどと同様に具体的な数字を入れて確認してみます。
(1,2,3)の成分6が、転置後は(3,2,1)の場所に移っているのが確認できます。
このようにして、Aの(i,j,k)成分と(k,j,i)成分がすべて入れ替わったのが3次元の転置行列です。
transposeメソッドの使い方
transposeメソッドの使い方について説明していきます。
transposeメソッドは、引数を指定して配列の軸を入れ替えるメソッドです。
2次元配列の軸を入れ替え
例として、先ほどの2次元配列の軸を入れ替えてみます。
1import numpy as np
2a = np.array([[0,1,2],[3,4,5]])
3#2×3の2次元配列
4print(a)
[[0 1 2]
[3 4 5]]
transposeメソッドの第一引数に1、第二引数に0を指定すると、(i,j)成分と(j,i)成分がすべて入れ替わります。
元々0番目だったところが1番目になり、元々1番目だったところが0番目になるというイメージです。
1import numpy as np
2
3a = np.array([[0,1,2],[3,4,5]])
4
5#aの転置行列を出力。transpose後は3×2の2次元配列。
6a.transpose(1,0)
array([[0, 3],
[1, 4],
[2, 5]])
3次元配列の軸を入れ替え
次に、先ほどの3次元配列についても軸の入れ替えをおこなってみます。
1import numpy as np
2
3b = np.array([[[0,1,2,3],[4,5,6,7],[8,9,10,11]],
4 [[12,13,14,15],[16,17,18,19],[20,21,22,23]]])
5#2×3×4の3次元配列です
6print(b)
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
transposeメソッドの第一引数に2、第二引数に1、第三引数に0を渡すと、(i,j,k)成分と(k,j,i)成分がすべて入れ替わります。
先ほどと同様に、(1,2,3)成分の6が転置後は、(3,2,1)の場所に移っているのが確認できます。
1import numpy as np
2
3b = np.array([[[0,1,2,3],[4,5,6,7],[8,9,10,11]],
4 [[12,13,14,15],[16,17,18,19],[20,21,22,23]]])
5
6#bの転置行列を出力。transpose後は4×3×2の3次元配列。
7b.transpose(2,1,0)
array([[[ 0, 12],
[ 4, 16],
[ 8, 20]],
[[ 1, 13],
[ 5, 17],
[ 9, 21]],
[[ 2, 14],
[ 6, 18],
[10, 22]],
[[ 3, 15],
[ 7, 19],
[11, 23]]])
さいごに
いかがでしたでしょうか。
transposeメソッドは、様々な書籍やドキュメントを見ても、分かりにくく説明が書かれていることが多いです。
「軸を入れ替える」という説明自体はされているのですが、「なぜtransposeを使ってできた配列の値の順序がこのようになるのか」という部分まで言及されている書籍は少ないように感じます。
この記事を読んで頂くことで、今までなんとなく感じていたモヤモヤが解消されれば嬉しいです。
transposeメソッドを使いこなせるようになると、配列操作を自由自在に行うことができて非常に便利です。
そうなれば、機械学習のスペシャリストに1歩近づいたことになることでしょう!
こちらの記事もオススメ!
2020.07.30Python 特集実装編※最新記事順Responder + Firestore でモダンかつサーバーレスなブログシステムを作ってみた!P...
2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
「好きを仕事にするエンジニア集団」の(株)ライトコードです! ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。 現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。 いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。 システム開発依頼・お見積もり大歓迎! また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」「WEBディレクター」を積極採用中です! インターンや新卒採用も行っております。 以下よりご応募をお待ちしております! https://rightcode.co.jp/recruit