NumPy配列ndarrayの行・列を任意の順番に並べ替え
NumPy配列ndarray
の行・列は、ファンシーインデックスという仕組みを使って任意の順番に並べ替え(入れ替え)ることができる。
行・列の場合についてそれぞれ説明する。
- 列を任意の順番に並べ替え
- 行を任意の順番に並べ替え
ファンシーインデックスについての詳細は以下の記事を参照。
昇順や降順に並べ替える(ソートする)にはnp.sort()
やnp.argsort()
、行と列を入れ替える(転置する)場合はT
属性やnp.transpose()
を使う。
ここでは、以下の二次元配列を例とする。
import numpy as np
a = np.arange(10, 35).reshape(5, 5)
print(a)
# [[10 11 12 13 14]
# [15 16 17 18 19]
# [20 21 22 23 24]
# [25 26 27 28 29]
# [30 31 32 33 34]]
source: numpy_swap_select.py
なお、二次元配列の行・列だけでなく、三次元以上の多次元配列でも同様に任意の次元の順番を並べ替えることができる。例えばカラー画像は(縦, 横, 色)
の三次元配列だが、三次元目の色の順番を並べ替えたりできる。
列を任意の順番に並べ替え
任意の順番のインデックスのリストを参照することで、並べ替えたndarray
が得られる。
col_swap = a[:, [3, 2, 4, 0, 1]]
print(col_swap)
# [[13 12 14 10 11]
# [18 17 19 15 16]
# [23 22 24 20 21]
# [28 27 29 25 26]
# [33 32 34 30 31]]
source: numpy_swap_select.py
逆順にしたい(反転したい)場合はリストよりもスライス::-1
が簡単。
col_inverse = a[:, ::-1]
print(col_inverse)
# [[14 13 12 11 10]
# [19 18 17 16 15]
# [24 23 22 21 20]
# [29 28 27 26 25]
# [34 33 32 31 30]]
source: numpy_swap_select.py
特定の列だけを抽出(選択)することもできる。重複してもOK。
col_select = a[:, [2, 4, 0]]
print(col_select)
# [[12 14 10]
# [17 19 15]
# [22 24 20]
# [27 29 25]
# [32 34 30]]
col_select2 = a[:, [2, 2, 2]]
print(col_select2)
# [[12 12 12]
# [17 17 17]
# [22 22 22]
# [27 27 27]
# [32 32 32]]
source: numpy_swap_select.py
行を任意の順番に並べ替え
行の場合も列の場合と同じ。
後方のインデックス, :
は省略可能([..., :]
は[...]
と等価)。
row_swap = a[[3, 2, 4, 0, 1], :]
print(row_swap)
# [[25 26 27 28 29]
# [20 21 22 23 24]
# [30 31 32 33 34]
# [10 11 12 13 14]
# [15 16 17 18 19]]
row_swap = a[[3, 2, 4, 0, 1]]
print(row_swap)
# [[25 26 27 28 29]
# [20 21 22 23 24]
# [30 31 32 33 34]
# [10 11 12 13 14]
# [15 16 17 18 19]]
row_inverse = a[::-1]
print(row_inverse)
# [[30 31 32 33 34]
# [25 26 27 28 29]
# [20 21 22 23 24]
# [15 16 17 18 19]
# [10 11 12 13 14]]
row_select = a[[2, 4, 0]]
print(row_select)
# [[20 21 22 23 24]
# [30 31 32 33 34]
# [10 11 12 13 14]]
row_select2 = a[[2, 2, 2]]
print(row_select2)
# [[20 21 22 23 24]
# [20 21 22 23 24]
# [20 21 22 23 24]]
source: numpy_swap_select.py