python 中是否有一个函数可以对 numpy 矩阵的行和列的某些部分进行混洗?

Is there a function that shuffles certain portion of both row and column of a numpy matrix in python?

我有一个二维矩阵。我想随机播放最后几列和与这些列关联的行。

我尝试使用 np.random.shuffle,但它只会随机排列列,而不是随机排列行。

def randomize_the_data(original_matrix, reordering_sz):
    new_matrix = np.transpose(original_matrix)
    np.random.shuffle(new_matrix[reordering_sz:])
    shuffled_matrix = np.transpose(new_matrix)
    print(shuffled_matrix)

a = np.arange(20).reshape(4, 5)
print(a)
print()
randomize_the_data(a, 2)

我原来的矩阵是这样的:

[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]]

我明白了。

[[ 0  1  3  4  2]
 [ 5  6  8  9  7]
 [10 11 13 14 12]
 [15 16 18 19 17]]

但我想要这样的东西。

[[ 0  1  3  2  4]
 [ 5  6  7  8  9]
 [10 11 14 12 13]
 [15 16 17 18 19]]

另一个例子是:

Original =

   -1.3702    0.3341   -1.2926   -1.4690   -0.0843
    0.0170    0.0332   -0.1189   -0.0234   -0.0398
   -0.1755    0.2182   -0.0563   -0.1633    0.1081
   -0.0423   -0.0611   -0.8568    0.0184   -0.8866


Randomized =

   -1.3702    0.3341   -0.0843   -1.2926   -1.4690
    0.0170    0.0332   -0.0398   -0.0234   -0.1189
   -0.1755    0.2182   -0.0563    0.1081   -0.1633
   -0.0423   -0.0611    0.0184   -0.8866   -0.8568

要打乱每一行的最后一个元素,您可以独立地遍历每一行并通过对每一行进行打乱来打乱最后几个数字,与其他行相比,每行将以不同的方式打乱,这与什么不同你之前有过每行都以相同方式洗牌的地方。

import numpy as np

def randomize_the_data(original_matrix, reordering_sz):
    for ln in original_matrix:
        np.random.shuffle(ln[reordering_sz:])
    print(original_matrix)

a = np.arange(20).reshape(4, 5)
print(a)
print()
randomize_the_data(a, 2)

输出:

[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]]

[[ 0  1  4  2  3]
 [ 5  6  8  7  9]
 [10 11 13 14 12]
 [15 16 17 18 19]]