Tanzira Najnin Tonu
Tanzira Najnin Tonu

Reputation: 100

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

I have a 2D matrix. I want to shuffle last few columns and rows associated with those columns.

I tried using np.random.shuffle but it only shuffles the column, not rows.

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)

My original matrix is this:

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

I am getting this.

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

But I want something like this.

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

Another example would be:

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

Upvotes: 1

Views: 30

Answers (1)

Hoog
Hoog

Reputation: 2298

To shuffle the last elements of each row you can go through each row independently and shuffle the last few numbers by doing the shuffle for each row, the rows will each be shuffled in different ways compared to each other, unlike what you had before where each row was shuffled the same way.

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)

OUTPUT:

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

Upvotes: 1

Related Questions