• トップ
  • ブログ一覧
  • 【Python】Numpyにおける軸の概念~2次元配列と3次元配列と転置行列~
  • 【Python】Numpyにおける軸の概念~2次元配列と3次元配列と転置行列~

    広告メディア事業部広告メディア事業部
    2020.01.09

    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×32次元配列 
    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×43次元配列です
    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×32次元配列 
    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.T2×22次元配列。
    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×43次元配列です
    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×32次元配列 
    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×22次元配列。
    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×43次元配列です
    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×23次元配列。
    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歩近づいたことになることでしょう!

    こちらの記事もオススメ!

    featureImg2020.07.30Python 特集実装編※最新記事順Responder + Firestore でモダンかつサーバーレスなブログシステムを作ってみた!P...

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    広告メディア事業部

    広告メディア事業部

    おすすめ記事