pythonでの2次元配列の結合・分割方法を紹介します。pythonで配列を扱う場合に使う頻度の高いテクニックになります。機械学習の自作の教師データを活用する際にも使用できます。
2次元配列を結合・分割(抽出)するために
以下のコードをベースに結合・分割方法を紹介します。
2次元配列を操作するのに便利なnumpyを活用します。
import numpy as np a = np.array([[10, 11, 12, 13, 14, 111], [20, 21, 22, 23, 24, 222], [30, 31, 32, 33, 34, 333], [40, 41, 42, 43, 44, 444]]) b = np.array([[1,10], [2,20], [3,30], [4,40]])
2次元配列配列の結合
まずは結合について。
np.appendで結合
c = np.append(a, b) # [ 10 11 12 13 14 111 20 21 22 23 24 222 30 31 32 33 34 333 40 41 42 43 44 444 1 10 2 20 3 30 4 40]
1次元の配列となります(末尾の8要素が bの要素になる)。
おそらく多くの人がやりたいと思っている結合ではないかと。
np.concatenateで結合
c = np.concatenate((a, b), axis=1) # [[ 10 11 12 13 14 111 1 10] # [ 20 21 22 23 24 222 2 20] # [ 30 31 32 33 34 333 3 30] # [ 40 41 42 43 44 444 4 40]]
各要素の末尾にbの要素が挿入されます。
2次元配列配列の分割(抽出)
次は分割(抽出)について。
スライスを活用するのでまずその説明から。
スライスについて
pythonの配列にはスライスという操作が可能で、範囲を指定することでその区間の要素を分割することができます。2次元配列の分割でもスライスが活躍します。
以下にスライスのサンプルを示します。
# スライスされる配列 data = [0, 1, 2, 3, 4, 5, 6, 7, 8] # 以下3通りのスライスを表示 s_data1 = data[:] # [0, 1, 2, 3, 4, 5, 6, 7, 8] ・・・要素全て s_data2 = data[0:4] # [0, 1, 2, 3] ・・・要素0番目から3番目まで(data[:4]でも同じ結果) s_data3 = data[3:6] # [3, 4, 5] ・・・要素3番目から5番目まで
配列dataに対して、data[A:B]という記述でスライスができます。
(A/Bの記載を省略した場合は、先頭/末尾の指定となる)
分割(抽出)される要素は、A番目から(B-1)番目の範囲になります。
別の表現をすると以下のようになります。
A ≦ 抽出範囲 < B
このスライスを用いて2次元配列の分割(抽出)します。
2次元配列の分割(抽出)
2次元配列でスライスをする場合は、data[A:B, C:D]のように記載します。
以下に例を示します。
a1 = a[:,:] ## 全て抽出(a[:]でも同じ結果になる) # [[ 10 11 12 13 14 111] # [ 20 21 22 23 24 222] # [ 30 31 32 33 34 333] # [ 40 41 42 43 44 444]] a2 = a[0:2,:] ## 0~1行目の、全列を分割 # [[ 10 11 12 13 14 111] # [ 20 21 22 23 24 222]] a3 = a[0:3,4:6] ## 0~2行目の、4~5列を分割 # [[ 14 111] # [ 24 222] # [ 34 333]]
このようにスライスを活用することで、2次元配列の中から必要な部分を分割(抽出)できます。
機械学習における教師データをデータとラベルを分離する場合
ここから機械学習向けの話。
自作のデータセットで、「入力データ + 正解ラベル(末尾)」の形式で作成した場合、モデルを学習させる際に入力データと正解ラベルを分離する場合があります。
その際には以下方法で分離することができます。
(aを自作データセットとし、各要素の末尾をラベルとしたサンプル。)
# データ部を取り出す X = a[:, 0:len(a[0])-1] # [[10 11 12 13 14] # [20 21 22 23 24] # [30 31 32 33 34] # [40 41 42 43 44]] # ラベル部を取り出す(各要素の末尾1つ) y = a[:, len(a[0])-1:] # [[111] # [222] # [333] # [444]] # y = a[:, len(a[0])-1:len(a[0])] でも同じ結果になる
2次元配列の行要素の数(len(a[0])を活用しています。
さいごに
自分のためにも一回まとめておきたかった内容。
忘れたら調べればいい世の中ですが、最低限は覚えておきたい。効率面でも。
コメント