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]]

存在を知っている人が少ないであろうこのメソッド、微妙に便利なので使えるときが来るかも知れません。