1. Hoán vị ngẫu nhiên là gì?

Trong toán học, hoán vị là mỗi cách sắp xếp n phần tử của tập hợp A theo một thứ tự nào đó được gọi là một hoán vị của n phần tử trong tập A.

Trong mảng Numpy, một hoán vị đề cập đến một sự sắp xếp của các phần tử thuộc trong mảng.Ví dụ [3, 2, 1] là hoán vị của [1, 2, 3] và ngược lại.

Mô-đun Numpy cung cấp hai hàm thường được sử dụng cho hoán vị phần tử trong mảng Numpy đó là:

  • Hàm shuffle() – xáo trộn các phần tử trong mảng
  • Hàm permutation() – hoán vị các phần tử trong mảng

2. Xáo trộn phần tử trong mảng

Việc xáo trộn các phần tử trong mảng có nghĩa là thực hiện đổi lại vị trí của các phần tử ban đầu thành các vị trí khác ngẫu nhiên trong mảng. Để làm được việc này, chúng ta cần sử dụng hàm random.shuffle() – hàm này nhận vào một mảng ban đầu và thực hiện xáo trộn các vị trí phần tử trong mảng.

Ví dụ dưới đây, sử dụng hàm random.shuffle() để xáo trộn các vị trí phần tử có trong mảng 1 chiều như sau:

from numpy import random
import numpy as np

arr = np.array([1, 2, 3, 4, 5])

random.shuffle(arr)

print(arr)

Kết quả:

[4 2 5 3 1]

Lưu ý: Khi thực thi lại chương trình, một mảng với các phần tử tại ví trị mới sẽ được tạo ra.

Tương tự như mảng 1 chiều, ta cũng có thể sử dụng hàm random.shuffle() để xáo trộn vị trí phần tử có trong mảng 2 chiều như sau:

from numpy import random
import numpy as np

arr = np.array([
    [1, 2, 3], 
    [4, 5, 0],
    [8, 2, 6],
    [1, 7, 4],
    [5, 2, 9]
])

random.shuffle(arr)

print(arr)

Kết quả:

[[5 2 9]
 [4 5 0]
 [1 7 4]
 [1 2 3]
 [8 2 6]]

Lưu ý: Vì trong mảng 2 chiều, các phần tử sẽ là mảng 1 chiều. Vậy nên, khi xáo trộn các vị trí phần tử có trong mảng 2 chiều thì việc này thực chất là xáo trộn các mảng 1 chiều thuộc trong mảng 2 chiều ban đầu.

3. Tạo hoán vị phần tử trong mảng

Chúng ta có thể tạo ra một mảng hoán vị từ một mảng ban đầu thông qua hàm random.permutation() – hàm này truyền vào một mảng cần hoán vị và thực hiện hoán vị ngẫu nhiên một dãy hoặc trả về một dãy đã hoán vị. 

Nếu mảng nhập vào hàm random.permutation() là một mảng nhiều chiều, nó chỉ được hoán vị dọc trục mà ta chỉ định cho nó (trục dọc hoặc trục ngang)

Ví dụ dưới đây, tạo hoán vị ngẫu nhiên các phần tử của mảng 1 chiều bằng cách sử dụng hàm random.permutation() như sau:
from numpy import random
import numpy as np

arr = np.array([1, 2, 3, 4, 5])

print(random.permutation(arr))

Kết quả:

[1 5 3 2 4]

Ví dụ tiếp theo, tạo hoán vị ngẫu nhiên các phần tử trong mảng 2 chiều dựa theo trục dọc bằng cách sử dụng hàm random.permutation() như sau:

from numpy import random
import numpy as np

arr = np.array([ 
    [1, 2, 3], 
    [4, 5, 0], 
    [8, 2, 6], 
    [1, 7, 4], 
    [5, 2, 9] 
])

print(random.permutation(arr))

Kết quả:

[[4 5 0]
 [8 2 6]
 [1 2 3]
 [5 2 9]
 [1 7 4]]