例示用の配列
以下の配列を例示用に準備する。
1 2 3 4 5 6 7 8 9 10 11 |
import numpy as np a = np.arange(30).reshape(6, 5) print(a) # [[ 0 1 2 3 4] # [ 5 6 7 8 9] # [10 11 12 13 14] # [15 16 17 18 19] # [20 21 22 23 24] # [25 26 27 28 29]] |
単一の行・列の抽出
単一の行の抽出
単に1つ目のインデックスを指定すると、それに対応する行が抽出される。2つ目の引数を省略すると、全て':'
を指定したことになる。
1 2 3 |
print(a[3]) # [15 16 17 18 19] |
単一の列の抽出
1つ目の引数を':'
とし、2つ目にインデックスを指定すると、対応する列が抽出される。ただし結果は1次元の配列となる。
1 2 3 |
print(a[:, 2]) # [ 2 7 12 17 22 27] |
これを列ベクトルとして取り出すのに2つの方法がある。
1つ目の方法はreshape(-1, 1)
とする定石。2つ目の引数1は列数1を指定し、1つ目の引数を−1にすることで、列数とサイズから適切な行数が設定される。
1 2 3 4 5 6 7 8 |
print(a[:, 2].reshape(-1, 1)) # [[ 2] # [ 7] # [12] # [17] # [22] # [27]] |
2つ目の方法は、列数を指定するのに敢えて1列のスライスで指定する方法。後述するように、列をスライスで指定した場合は2次元の形状が保持されることを利用している。以下の例では、2列目から2列目までの「範囲」を指定している。
1 2 3 4 5 6 7 8 |
print(a[:, 2:3]) # [[ 2] # [ 7] # [12] # [17] # [22] # [27]] |
連続する複数の行・列の抽出
連続する複数行の抽出
1つ目の引数をスライスで指定して、連続する複数行を抽出。
1 2 3 4 5 |
print(a[2:5]) # [[10 11 12 13 14] # [15 16 17 18 19] # [20 21 22 23 24]] |
連続する複数列の抽出
2つ目の引数をスライスで指定して、連続する複数列を抽出。
1 2 3 4 5 6 7 8 |
print(a[:, 1:4]) # [[ 1 2 3] # [ 6 7 8] # [11 12 13] # [16 17 18] # [21 22 23] # [26 27 28]] |
不連続な複数の行・列を抽出
不連続な複数の行を抽出
第1引数をリストで指定すると、その要素をインデックスとする複数の行が抽出される。このような指定方法のインデックスを、ファンシーインデックスと言う。
1 2 3 4 |
print(a[[2, 4]]) # [[10 11 12 13 14] # [20 21 22 23 24]] |
リストの要素は昇順である必要はなく、要素順に行が取り出される。
1 2 3 4 |
print(a[[4, 2]]) # [[20 21 22 23 24] # [10 11 12 13 14]] |
不連続な複数の列の抽出
1つ目の引数を':'
とし、2つ目の引数をリストで指定して要素に対応する列を取り出せる。
1 2 3 4 5 6 7 8 |
print(a[:, [1, 3]]) # [[ 1 3] # [ 6 8] # [11 13] # [16 18] # [21 23] # [26 28]] |
列についても、要素の順番は任意。
1 2 3 4 5 6 7 8 |
print(a[:, [3, 1]]) # [[ 3 1] # [ 8 6] # [13 11] # [18 16] # [23 21] # [28 26]] |