「配列の軸」の版間の差分

提供: tknotebook
移動: 案内検索
(2次元配列の軸)
 
(1人の利用者による、間の29版が非表示)
4行: 4行:
  
 
Numpy を使用していると '''axis''' というパラメータによく出くわしますが、
 
Numpy を使用していると '''axis''' というパラメータによく出くわしますが、
あまりよい解説がなく戸惑う人が多いと思います。
+
ちょっとわかりにくい。
  
 
そこで「軸(axis)」を簡単に説明してみようと思います。
 
そこで「軸(axis)」を簡単に説明してみようと思います。
11行: 11行:
 
== 多次元配列 ==
 
== 多次元配列 ==
  
用語等を解説したいので、とりあえず3次元配列を中心に話を進めます。
+
とりあえず3次元配列を中心に話を進めます。
  
まず、3×3×3(shape = (3, 3, 3)) の配列を作ってみます。
+
まず、3×4×2(shape = (3, 4, 2)) の配列を作ってみます。
  
  
21行: 21行:
 
   
 
   
 
  a = np.array(
 
  a = np.array(
     [  [  [1, 2], [4, 5], [7, 8]        ],
+
     [  [  [1, 2], [3, 4], [5, 6]        ],
         [  [10, 11], [13, 14], [16, 17]  ],
+
         [  [7, 8], [9, 10], [11, 12]    ],
         [  [19, 20], [22, 23], [25, 26]  ]
+
        [  [13, 14], [15, 16], [17, 18]  ],
 +
         [  [19, 20], [21, 22], [23, 24]  ]
 
     ]
 
     ]
 
  )
 
  )
  print(repr(a))
+
  print(repr(a)) print(repr(a))
  
 
3次元配列はこんな感じで表示されます。
 
3次元配列はこんな感じで表示されます。
  
 
  array([[[ 1,  2],
 
  array([[[ 1,  2],
         [ 45],
+
         [ 34],
         [ 78]],
+
         [ 56]],
 
   
 
   
       [[10, 11],
+
       [[ 7,  8],
        [13, 14],
+
        [ 9, 10],
         [16, 17]],
+
        [11, 12]],
 +
 +
      [[13, 14],
 +
         [15, 16],
 +
        [17, 18]],
 
   
 
   
 
       [[19, 20],
 
       [[19, 20],
         [22, 23],
+
         [21, 22],
         [25, 26]]])
+
         [23, 24]]])
  
numpyの ndarray は自身を表示するとき、最も下位の次元の要素を横に並べて表示し、他の次元は縦に並べて表示するので、かなり見にくいです。
+
numpyの ndarray は自身を表示するとき、最も下位の次元の要素を横に並べて表示し、他の次元は縦に並べて表示するので、
 +
かなり見にくいですね。
 +
 
 +
この配列の第1次元目の2つ目の要素の中の、第2次元目の3つ目の要素の中の、第3次元目の1つ目の要素にアクセスするには、
 +
各次元の配列インデックスを使って
  
この配列の第1次元の2つ目、第2次元3つ目、第3次元の1つ目にアクセスするには
 
 
  a[1][2][0]
 
  a[1][2][0]
と書きますが、numpyの配列は
+
 
 +
と書けばできます。さらに、numpyの配列では
 +
 
 
  a[1, 2, 0]
 
  a[1, 2, 0]
とも書けます。便利ですね。もちろん値は 16 になります。
+
 
 +
と簡略に書くこともできます。便利ですね。もちろん値は 11 になります。
 +
 
 +
==軸==
  
 
この3次元配列とその配列インデックスの関係を表したものが下図です。
 
この3次元配列とその配列インデックスの関係を表したものが下図です。
56行: 69行:
 
これは3次元の配列を、小さな立方体を多数集めた直方体で表現したもので、個々の立方体は最下位次元の配列の要素です。
 
これは3次元の配列を、小さな立方体を多数集めた直方体で表現したもので、個々の立方体は最下位次元の配列の要素です。
  
垂直とか、水平とか、深さと書いてあるので配列のインデックスのことで、
+
垂直とか、水平とか、深さと書いてあるのは配列のインデックスのことで、
 +
 
 +
'''axis(軸)''' とは簡単に言ってしまえば
 +
 
 +
* 配列の次元に付けた番号
 +
* 番号の示す配列の次元のインデックスを変化させたときの方向
 +
 
 +
たいていは関数のパラメータとして、どの次元のインデックスを変化させて処理するかを表していると考えてもよいです。
 +
具体的な意味は、axis をパラメータに取る関数の仕様によりかなり変わってきます。
 +
 
 +
図で各軸(axis)の幾何学的な意味と次元の関係は
 +
 
 +
axis = 0 → 垂直方向の次元(vertical) = 1番目(最上位)の次元 = 1番目(最上位)のインデックスが変化する方向
 +
 
 +
axis = 1 → 水平方向の次元(horizontal) = 2番目の次元 = 2番目のインデックスが変化する方向
 +
 
 +
axis = 2 → 深さ方向の次元(depth) = 3番目の次元 = 3番目のインデックスが変化する方向
 +
 
 +
尚、いろんなサイトの numpy の解説では 図の深さ方向を axis = 0 と紹介するのが一般的ですが、
 +
軸方向へ配列を連結する np.vstack(axis=0方向), np.hstack(axis=1方向), np.dstack(axis=2方向) 関数の名称から
 +
numpy の実装者たちが axis=0 → 垂直、axis=1 → 水平、axis=2 → 奥行 と考えているようなので、
 +
このような図にしてみました。
 +
 
 +
==4次元以上の配列の軸==
 +
 
 +
4次元以上の配列の立体的な把握は困難なので、
 +
'''axis(軸)'''は
 +
 
 +
1番目の次元 → axis=0
 +
2番目の次元 → axis=1
 +
3番目の次元 → axis=2
 +
4番目の次元 → axis=3
 +
5番目の次元 → axis=4
  
垂直(axis=0) とは3次元配列の最上位の次元のインデックスのこと。
+
というように覚えておけばよいでしょう。3次元以下の配列でもこれで十分かもしれません。
  
水平(axis=1) とは3次元配列の2番目の次元のインデックスのこと。
+
==2次元配列の軸==
  
深さ(axis=2) とは3次元配列の3番目(最下位)の次元のインデックスのこと。
+
2次元配列は行列として扱うことが多いですが、その場合 '''axis()''' は
  
axis とは簡単に言ってしまえば、配列のインデクスにつけた番号です。
+
axis=0 の次元のインデックス値→ 行番号
 +
axis=1 の次元のインデックス値→ 列番号
  
axis = 0 → 垂直方向のインデックス(vertical) = 1番目(最上位)の次元のインデックス
+
となります。ただし、軸の表す方向は、行方向, 列方向という意味ではなくて、
  
axis = 1 水平方向のインデックス(horizontal) = 2番目の次元のインデックス  
+
axis=0 行を横断する方向 = 列に沿う方向 = 列方向
 +
  axis=1 → 列を横断する方向 = 行に沿う方向 = 行方向
  
axis = 2 → 深さ方向のインデックス(depth) = 3番目(最下位)の次元のインデックス
+
となるので、混乱しないように。

2022年5月4日 (水) 10:06時点における最新版

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


Numpy を使用していると axis というパラメータによく出くわしますが、 ちょっとわかりにくい。

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


多次元配列

とりあえず3次元配列を中心に話を進めます。

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


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

import numpy as np

a = np.array(
   [   [   [1, 2], [3, 4], [5, 6]        ],
       [   [7, 8], [9, 10], [11, 12]     ],
       [   [13, 14], [15, 16], [17, 18]  ],
       [   [19, 20], [21, 22], [23, 24]  ]
   ]
)
print(repr(a)) print(repr(a))

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

array([[[ 1,  2],
       [ 3,  4],
       [ 5,  6]],

      [[ 7,  8],
       [ 9, 10],
       [11, 12]],

      [[13, 14],
       [15, 16],
       [17, 18]],

      [[19, 20],
       [21, 22],
       [23, 24]]])

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

この配列の第1次元目の2つ目の要素の中の、第2次元目の3つ目の要素の中の、第3次元目の1つ目の要素にアクセスするには、 各次元の配列インデックスを使って

a[1][2][0]

と書けばできます。さらに、numpyの配列では

a[1, 2, 0]

と簡略に書くこともできます。便利ですね。もちろん値は 11 になります。

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

軸.png

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

垂直とか、水平とか、深さと書いてあるのは配列のインデックスのことで、

axis(軸) とは簡単に言ってしまえば

  • 配列の次元に付けた番号
  • 番号の示す配列の次元のインデックスを変化させたときの方向

たいていは関数のパラメータとして、どの次元のインデックスを変化させて処理するかを表していると考えてもよいです。 具体的な意味は、axis をパラメータに取る関数の仕様によりかなり変わってきます。

図で各軸(axis)の幾何学的な意味と次元の関係は

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

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

axis = 2 → 深さ方向の次元(depth) = 3番目の次元 = 3番目のインデックスが変化する方向

尚、いろんなサイトの numpy の解説では 図の深さ方向を axis = 0 と紹介するのが一般的ですが、 軸方向へ配列を連結する np.vstack(axis=0方向), np.hstack(axis=1方向), np.dstack(axis=2方向) 関数の名称から numpy の実装者たちが axis=0 → 垂直、axis=1 → 水平、axis=2 → 奥行 と考えているようなので、 このような図にしてみました。

4次元以上の配列の軸

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

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 → 列を横断する方向 = 行に沿う方向 = 行方向

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