numpy では以前から numpy.random.Generator.shuffle や numpy.random.Generator.permutation を用いることで、特定の軸をシャッフルすることができました。これらの乱数生成器を用いる方式よりもさらに昔は numpy.random.shuffle を使っていましたが、現在は乱数生成器を用いる方法が推奨されています。
例えば次のようにシャッフルします。
import numpy as np
matrix2d = np.array([[1,2,3],
[4,5,6],
[7,8,9]])
rng = np.random.default_rng()
matrix2d = rng.permutation(matrix2d, axis=1) # 二次元目(列)をシャッフル
# rng.shuffle(matrix2d, axis=1) としても良い。
print(matrix2d)
# output
# [[2 3 1]
# [5 6 4]
# [8 9 7]]
しかし、ときには各列や各行など任意の軸のデータを、それぞれの軸に沿って別々に(他の軸を固定して)シャッフルしたい場合があります。
NumPy 1.20 でひっそりと追加された numpy.random.Generator.permuted を用いると簡単に実現できます。
import numpy as np
matrix2d = np.array([[1,2,3],
[4,5,6],
[7,8,9]])
rng = np.random.default_rng()
matrix2d = rng.permuted(matrix2d, axis=1) # 二次元目(列)を行ごとにシャッフル
print(matrix2d)
# output
# [[2 3 1]
# [6 4 5]
# [9 8 7]]
存在を知っている人が少ないであろうこのメソッド、微妙に便利なので使えるときが来るかも知れません。