やりたいことのイメージ
一次元配列と二次元配列の結合をしたい。
配列のイメージとしては以下の通り。
- 二次元配列
サンプルとして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 |
一次元配列と二次元配列の結合の処理の流れ
- 一次元配列の二次元配列化
- 二次元配列化された一次元配列と二次元配列の結合
使用する関数等
名称 | 説明 |
---|---|
numpy | ベクトルや行列の演算を行うのに便利なライブラリ |
numpy.array | 多次元配列(ndarray)を生成するための関数 |
ndarray.reshape() | 配列の形状変更をする |
numpy.hstack() | 二次元配列を横方向に結合する |
numpy.concatenate() | 配列を結合する 引数 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便利!感じた一件でした。