「配列の軸」の版間の差分
(→多次元配列) |
(→2次元配列の軸) |
||
(1人の利用者による、間の27版が非表示) | |||
4行: | 4行: | ||
Numpy を使用していると '''axis''' というパラメータによく出くわしますが、 | Numpy を使用していると '''axis''' というパラメータによく出くわしますが、 | ||
− | + | ちょっとわかりにくい。 | |
そこで「軸(axis)」を簡単に説明してみようと思います。 | そこで「軸(axis)」を簡単に説明してみようと思います。 | ||
11行: | 11行: | ||
== 多次元配列 == | == 多次元配列 == | ||
− | + | とりあえず3次元配列を中心に話を進めます。 | |
− | + | まず、3×4×2(shape = (3, 4, 2)) の配列を作ってみます。 | |
21行: | 21行: | ||
a = np.array( | a = np.array( | ||
− | [ [ [1, 2], [4 | + | [ [ [1, 2], [3, 4], [5, 6] ], |
− | [ [10, 11], [13, 14], [16, 17] ], | + | [ [7, 8], [9, 10], [11, 12] ], |
− | [ [19, 20], [ | + | [ [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], | ||
− | [ | + | [ 3, 4], |
− | [ | + | [ 5, 6]], |
− | [[10, 11], | + | [[ 7, 8], |
− | + | [ 9, 10], | |
− | [16, 17]], | + | [11, 12]], |
+ | |||
+ | [[13, 14], | ||
+ | [15, 16], | ||
+ | [17, 18]], | ||
[[19, 20], | [[19, 20], | ||
− | [ | + | [21, 22], |
− | [ | + | [23, 24]]]) |
− | numpyの ndarray | + | numpyの ndarray は自身を表示するとき、最も下位の次元の要素を横に並べて表示し、他の次元は縦に並べて表示するので、 |
+ | かなり見にくいですね。 | ||
+ | |||
+ | この配列の第1次元目の2つ目の要素の中の、第2次元目の3つ目の要素の中の、第3次元目の1つ目の要素にアクセスするには、 | ||
+ | 各次元の配列インデックスを使って | ||
− | |||
a[1][2][0] | a[1][2][0] | ||
− | + | ||
+ | と書けばできます。さらに、numpyの配列では | ||
+ | |||
a[1, 2, 0] | a[1, 2, 0] | ||
− | + | ||
+ | と簡略に書くこともできます。便利ですね。もちろん値は 11 になります。 | ||
==軸== | ==軸== | ||
58行: | 69行: | ||
これは3次元の配列を、小さな立方体を多数集めた直方体で表現したもので、個々の立方体は最下位次元の配列の要素です。 | これは3次元の配列を、小さな立方体を多数集めた直方体で表現したもので、個々の立方体は最下位次元の配列の要素です。 | ||
− | + | 垂直とか、水平とか、深さと書いてあるのは配列のインデックスのことで、 | |
− | '''axis''' | + | |
+ | '''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 = | + | axis=0 → 行を横断する方向 = 列に沿う方向 = 列方向 |
+ | axis=1 → 列を横断する方向 = 行に沿う方向 = 行方向 | ||
− | + | となるので、混乱しないように。 |
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次元配列とその配列インデックスの関係を表したものが下図です。
これは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 → 列を横断する方向 = 行に沿う方向 = 行方向
となるので、混乱しないように。