Pythonプログラミング

【python】2次元配列の結合・分割(抽出)【教師データ】

pythonの2次元配列結合・分割方法のアイキャッチ画像 Python

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])を活用しています。

スポンサーリンク

さいごに

自分のためにも一回まとめておきたかった内容。
忘れたら調べればいい世の中ですが、最低限は覚えておきたい。効率面でも。

コメント

タイトルとURLをコピーしました