配列の軸

提供: tknotebook
2022年5月4日 (水) 08:07時点におけるNakamuri (トーク | 投稿記録)による版

移動: 案内検索

メインページ>コンピュータの部屋#Python>Numpy Tips


Numpy を使用していると axis というパラメータによく出くわしますが、 あまりよい解説がなく戸惑う人が多いと思います。

そこで「軸(axis)」を簡単に説明してみようと思います。


多次元配列

用語等を解説したいので、とりあえず3次元配列を中心に話を進めます。

まず、3×3×3(shape = (3, 3, 3)) の配列を作ってみます。


python の REPL にこんなコードを入力すると

import numpy as np

a = np.array(
   [   [   [1, 2], [4, 5], [7, 8]        ],
       [   [10, 11], [13, 14], [16, 17]  ],
       [   [19, 20], [22, 23], [25, 26]  ]
   ]
)
print(repr(a))

3次元配列はこんな感じで表示されます。

array([[[ 1,  2],
       [ 4,  5],
       [ 7,  8]],

      [[10, 11],
       [13, 14],
       [16, 17]],

      [[19, 20],
       [22, 23],
       [25, 26]]])

numpyの ndarray は自身を表示するとき、最も下位の次元の要素を横に並べて表示し、他の次元は縦に並べて表示するので、かなり見にくいです。

この配列の第1次元の2つ目、第2次元3つ目、第3次元の1つ目にアクセスするには

a[1][2][0]

と書きますが、numpyの配列は

a[1, 2, 0]

とも書けます。便利ですね。もちろん値は 16 になります。

この3次元配列とその配列インデックスの関係を表したものが下図です。

軸.png

これは3次元の配列を、小さな立方体を多数集めた直方体で表現したもので、個々の立方体は最下位次元の配列の要素です。

垂直とか、水平とか、深さと書いてあるので配列のインデックスのことで、 axis(軸) とは簡単に言ってしまえば、配列のインデクスにつけた番号です。

軸はインデックスそのもの、あるいはインデックスを変化させたときの方向を表します。


axis = 0 → 垂直方向のインデックス(vertical) = 1番目(最上位)の次元のインデックス

axis = 1 → 水平方向のインデックス(horizontal) = 2番目の次元のインデックス

axis = 2 → 深さ方向のインデックス(depth) = 3番目(最下位)の次元のインデックス

尚、numpy の解説で 図の深さ方向を axis = 0 と紹介するのが一般的ですが、 軸方向へ配列を連結する np.vstack(axis=0方向), np.hstack(axis=1方向), np.dstack(axis=2方向) 関数の名称を鑑み 奥行方向を axis=2 としました。


4次元以上の配列の軸

4次元以上の配列の立体的な把握は困難なので、 軸は

1番目の次元のインデックス → axis=0
2番目の次元のインデックス → axis=1
3番目の次元のインデックス → axis=2
4番目の次元のインデックス → axis=3
5番目の次元のインデックス → axis=4

というように覚えておけばよいでしょう。3次元以下の配列でもこれで十分かもしれません。

2次元配列の軸

2次元配列では、axis は

axis=0 → 行番号
axis=1 → 列番号

但しこれは、行方向, 列方向という意味ではなくて、

axis=0 → 行を横断する方向
axis=1 → 列を横断する方向 = 行方向

なので、混乱しないように。