【python】一次元配列と二次元配列の結合

# やりたいことのイメージ
一次元配列と二次元配列の結合をしたい。
配列のイメージとしては以下の通り。
+ 二次元配列
サンプルとしてRBG値を格納した二次元配列を想定

| R | G | B |
|:-:|:-:|:-:|
| 0 | 128 | 255 |
| 255 | 128 | 0 |
| 255 | 0 | 128 |
| 0 | 255 | 128 |

+ 一次元配列
サンプルとして優先度(priority)を格納した一次元配列を想定

| priority |
|:-:|
| 2 |
| 3 |
| 1 |
| 4 |

## 結合結果のイメージ
| R | B | G | priority |
|:-:|:-:|:-:|:-:|
| 0 | 128 | 255 | 2 |
| 255 | 128 | 0 | 3 |
| 255 | 0 | 128 | 1 |
| 0 | 255 | 128 | 4 |

# 一次元配列と二次元配列の結合の処理の流れ
1. 一次元配列の二次元配列化
2. 二次元配列化された一次元配列と二次元配列の結合

# 使用する関数等
| 名称 | 説明 |
|:-|:-|
| numpy | ベクトルや行列の演算を行うのに便利なライブラリ |
| numpy.array | 多次元配列(ndarray)を生成するための関数 |
| ndarray.reshape() | 配列の形状変更をする |
| numpy.hstack() | 二次元配列を横方向に結合する |
| numpy.concatenate() | 配列を結合する<br>引数`axis=0`で縦方向(デフォルト)`axis=0`で横方向に結合される |

詳しい使い方は実際のコードにて

# 実際のコード
```main.py
import numpy as np

def main():

  # 元データ
  rgb_data = np.array([[0,128,255],[255,128,0],[255,0,128],[0,255,128]])
  priority_data = np.array([2,3,1,4])

  print('--- original_data ---')
  print(rgb_data)
  print(priority_data)

  # hstackを使って横方向に結合
  # priority_dataをreshapeして縦4横1の二次元配列化する
  priority_reshape_beside = priority_data.reshape(4, 1) 
  # 横方向に結合(一番右に一行追加される)
  rgb_priority_hstack = np.hstack([rgb_data, priority_reshape_beside]) 
  print('--- hstack ---')
  print(rgb_priority_hstack)

  # concatenateを使って横方向に結合
  # axis=1なので横方向に結合
  rgb_priority_concatenate_horizontal = np.concatenate([rgb_data, priority_reshape_beside], axis=1) 
  print('--concatenate horizontal--')
  print(rgb_priority_concatenate_horizontal)

  # おまけ----------------------------------------------------------------------
  # vstackを使って縦方向に結合
  # データ数を合わせる
  priority_data_2 = np.array([2,3,1]) 
  # priority_dataをreshapeして縦1横3の二次元配列化する
  priority_reshape_vertical = priority_data_2.reshape(1, 3) 
  # 縦方向に結合(下に追加される)
  rgb_priority_vstack = np.vstack([rgb_data, priority_reshape_vertical]) 
  print('--- vstack ---')
  print(rgb_priority_vstack)
  print('--------------')

  # concatenateを使って縦方向に結合
  # axis=0なので縦方向に結合
  rgb_priority_concatenate_vertical = np.concatenate([rgb_data, priority_reshape_vertical], axis=0) 
  print('--concatenate vertical--')
  print(rgb_priority_concatenate_vertical)

  # 要素番号3(priority)を指定して昇順にソート
  rgb_priority_argsort_up = rgb_priority_hstack[np.argsort(rgb_priority_hstack[:, 3])]
  print('--argsort up--')
  print(rgb_priority_argsort_up)

  # 要素番号3(priority)を指定して降順[::-1]にソート
  rgb_priority_argsort_down = rgb_priority_hstack[np.argsort(rgb_priority_hstack[:, 3])[::-1]]
  print('--argsort down--')
  print(rgb_priority_argsort_down)

if __name__ == '__main__':
  main()
```

# 実行結果
```
--- original_data ---
[[  0 128 255]
 [255 128   0]
 [255   0 128]
 [  0 255 128]]
[2 3 1 4]
--- hstack ---
[[  0 128 255   2]
 [255 128   0   3]
 [255   0 128   1]
 [  0 255 128   4]]
--concatenate horizontal--
[[  0 128 255   2]
 [255 128   0   3]
 [255   0 128   1]
 [  0 255 128   4]]
--- vstack ---
[[  0 128 255]
 [255 128   0]
 [255   0 128]
 [  0 255 128]
 [  2   3   1]]
--------------
--concatenate vertical--
[[  0 128 255]
 [255 128   0]
 [255   0 128]
 [  0 255 128]
 [  2   3   1]]
--argsort up--
[[255   0 128   1]
 [  0 128 255   2]
 [255 128   0   3]
 [  0 255 128   4]]
--argsort down--
[[  0 255 128   4]
 [255 128   0   3]
 [  0 128 255   2]
 [255   0 128   1]]
```

# さいごに
一次元配列同士、二次元配列同士の結合方法はすぐ見つけられましたが、一次元配列×二次元配列の結合はなかなか見つけられなかったので。
python初心者ですが、python便利！感じた一件でした。

配列について調べていると行列が縦方向か横方向かわからなくなるので自分用メモ
![行列説明.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2669912/061f55ad-d6e0-e57a-6f7d-95517d4f2980.png)