1. HOME
  2. ブログ
  3. IT技術
  4. 【Python】Numpyにおける軸の概念~2次元配列と3次元配列と転置行列~

【Python】Numpyにおける軸の概念~2次元配列と3次元配列と転置行列~

Numpyにおける軸の概念

機械学習の分野では、行列の操作がよく出てきます。

PythonのNumpyという外部ライブラリが扱う配列には、便利な機能が多く備わっており、機械学習の実装でもこれらの機能をよく使います。

Numpyの配列機能は、慣れれば大きな効果を発揮しますが、多少クセがあるのも事実です。

特に、Numpyでの軸の考え方は、初心者にはわかりづらい部分かと思います。

私も初心者の際に、理解するのに苦労しました。

この記事では、Numpyにおける軸の概念について詳しく解説していきたいと思います!

2次元配列

軸とは何か

Numpyにおける軸とは、配列内の数値が並ぶ方向のことです。

そのため当然ですが、2次元配列には2つ3次元配列には3つ、軸があることになります。

2次元配列

例えば、以下のような 2×3 の、2次元配列を考えてみることにしましょう。

[[0 1 2]
[3 4 5]]

軸の向きはインデックスで表します。

上の2次元配列の場合、axis=0 が縦方向を表し、axis=1 が横方向を表します。

2次元配列の軸

3次元配列

次に、以下のような 2×3×4 の3次元配列を考えてみます。

[[[ 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次元配列で考えて見ましょう。

[[0 1 2]
[3 4 5]]

転換してみる

この行列を転置してみると、以下のようになります。

具体的には、(2,3)成分である「5」が(3,2)成分に移動しているのが確認できます。

他の成分に関しても同様のことが言えます。

このようにして、Aの(i,j)成分と(j,i)成分が、すべて入れ替わったのが転置行列です。

[[0 3]
[1 4]
[2 5]]

2次元配列については比較的、理解しやすいと思います。

しかし、転置行列は2次元以上に拡張して考えることもできます。

3次元配列の場合

3次元配列の場合には、(i,j,k)成分が(k,j,i)成分に移動します。

こちらも文字だけだとイメージが湧きにくいと思うので、先ほどの3次元配列を例に考えてみます。

[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]

転換してみる

これを転置すると以下のようになります。

[[[ 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次元配列の軸を入れ替えてみます。

[[0 1 2]
[3 4 5]]

transposeメソッドの第一引数に1、第二引数に0を指定すると、(i,j)成分と(j,i)成分がすべて入れ替わります。

元々0番目だったところが1番目になり、元々1番目だったところが0番目になるというイメージです。

array([[0, 3],
[1, 4],
[2, 5]])

3次元配列の軸を入れ替え

次に、先ほどの3次元配列についても軸の入れ替えをおこなってみます。

[[[ 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)の場所に移っているのが確認できます。

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歩近づいたことになることでしょう!

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

書いた人はこんな人

広告メディア事業部
広告メディア事業部
「好きを仕事にするエンジニア集団」の(株)ライトコードです!

ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。
現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。
いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。

システム開発依頼・お見積もり大歓迎!

また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」「WEBディレクター」を積極採用中です!
インターンや新卒採用も行っております。

以下よりご応募をお待ちしております!
https://rightcode.co.jp/recruit

関連記事

採用情報

\ あの有名サービスに参画!? /

バックエンドエンジニア

\ クリエイティブの最前線 /

フロントエンドエンジニア

\ 世界を変える…! /

Androidエンジニア

\ みんなが使うアプリを創る /

iOSエンジニア