概要
リスト、ndarray
の2次元配列について、いろいろな要素の取り出し方を整理する。
リストについては、以下の配列を準備する。
1 2 3 4 5 6 7 8 |
a = [[0, 1, 2, 3], [10, 11, 12, 13], [20, 21, 22, 23], [30, 31, 32, 33]] print(a) # [[0, 1, 2, 3], [10, 11, 12, 13], [20, 21, 22, 23], [30, 31, 32, 33]] |
ndarray
については、以下の配列を準備する。
1 2 3 4 5 6 7 8 9 10 11 |
b = np.array([[0, 1, 2, 3], [10, 11, 12, 13], [20, 21, 22, 23], [30, 31, 32, 33]]) print(b) # [[ 0 1 2 3] # [10 11 12 13] # [20 21 22 23] # [30 31 32 33]] |
各要素の10の位が行を、1の位が列を表している。
特定要素の取り出し
リストの場合は[行番号][列番号]
で取り出す。
1 2 3 |
print(a[1][2]) # 12 |
ndarrayの場合もリストと同じ。
1 2 3 |
print(b[1][2]) # 12 |
ただしndarray
にはもう一つの方法があって、[行番号, 列番号]
でも指定できる。
1 2 3 |
print(b[1, 2]) # 12 |
行の取り出し
リストの場合[行番号]
で該当する行を取り出せる。
1 2 3 |
print(a[1]) # [10, 11, 12, 13] |
スライスを使って複数行を取り出すこともできる。
1 2 3 |
print(a[1:3]) # [[10, 11, 12, 13], [20, 21, 22, 23]] |
ndarray
の場合もリストと同じ。
1 2 3 |
print(b[1]) # [10 11 12 13] |
スライスの場合も同じ。
1 2 3 4 |
print(b[1:3]) # [[10 11 12 13] # [20 21 22 23]] |
ndarray
用の指定の場合、列番号を省略。
1 2 3 |
print(b[1,]) # [10 11 12 13] |
行をスライス指定する場合。
1 2 3 4 |
print(b[1:3,]) # [[10 11 12 13] # [20 21 22 23]] |
列の取り出し
ndarray
での列の取り出し方は以下の通り。ただし、取り出された列は行方向の配列に変更される点に注意。
1 2 3 |
print(b[:, 1]) # [ 1 11 21 31] |
スライスを使って複数列を取り出せる。
1 2 3 4 5 6 |
print(b[:, 1:3]) # [[ 1 2] # [11 12] # [21 22] # [31 32]] |
スライスを使うと、単一の列を列ベクトルとして取り出せる。
1 2 3 4 5 6 |
print(b[:, 1:2]) # [[ 1] # [11] # [21] # [31]] |
reshape()
で行ベクトルを列ベクトルに変換してもよい。
1 2 3 4 5 6 |
print(b[:, 1].reshape(4, 1)) # [[ 1] # [11] # [21] # [31]] |
なお、リスト、ndarray
とも、以下の指定方法では意図した列の抽出にならず、行の抽出になってしまう。
1 2 3 4 5 6 |
print(b[:][1]) print(b[:][1:3]) # [10 11 12 13] # [[10 11 12 13] # [20 21 22 23]] |
内包表記による列指定
リスト、ndarrayとも、内包表記を使って列を取り出せる。ただし結果は行ベクトルとなる。
1 2 3 4 5 |
print([row[1] for row in b]) print(np.array([row[1] for row in b])) # [1, 11, 21, 31] # [ 1 11 21 31] |
複数列の取り出しは以下の通り。
リストの場合、表現が少し違うが、[行番号][列番号]で要素が取り出せる。
1 2 3 4 5 6 7 8 |
print([row[1:3] for row in b]) print(np.array([row[1:3] for row in b])) # [array([1, 2]), array([11, 12]), array([21, 22]), array([31, 32])] # [[ 1 2] # [11 12] # [21 22] # [31 32]] |
有益な記事、ありがとうございます。
最後のサンプルコード、4行目は1行目の標準出力の結果を示しているものと理解してよろしいですね?
他のサンプルでは出力結果を#でコメントとして表示されているので、念のため伺いました。
返信が遅くなりすみません。
ご指摘の通り’#’が抜けていたので修正しました。
コメントをいただいてありがとうございました。