• トップ
  • ブログ一覧
  • 【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×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×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×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.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×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×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ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    メディアチーム
    メディアチーム
    Show more...

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background