1. Sắp xếp mảng bằng np.sort()

Sắp xếp mảng là việc thực hiện đặt các phần tử trong mảng theo một trình từ nhất định. Trình tự có thể là các phần tử trong mảng tăng dần hoặc cũng có thể là giảm dần, ngoài ra cũng có thể sắp xếp các phần tử trong mảng theo bảng chữ cái alphabet.

Trong Numpy, cho phép ta thực hiện công việc sắp xếp các phần tử có trong mảng thông qua hàm có sẵn np.sort() – hàm này sẽ sắp xếp mảng theo một trình tự và trả về kết quả là một mảng mới sau khi sắp xếp thành công.

Ví dụ dưới đây, sử dụng hàm np.sort() để sắp xếp mảng 1 chiều theo trình tự các phần tử tăng dần theo giá trị như sau:

import numpy as np

# Mang a
a = np.array([3, 2, 0, 1])

# Sap xep mang theo trinh tu tang dan
b = np.sort(a)
print(b)

Kết quả:

[0 1 2 3]

Lưu ý: Mặc định hàm np.sort() sẽ thực hiện sắp xếp các phần tử trong mảng theo thuật toán Quicksort (thuật toán sắp xếp nhanh).

Ví dụ tiếp theo, sử dụng hàm np.sort() để sắp xếp mảng 2 chiều theo rình tự các phần tử tăng dần theo giá trị như sau:

import numpy as np 
# Mang a 
a = np.array([
    [6, 2, 4], 
    [5, 0, 1], 
    [1, 3, 2]
])
print("Mang ban dau")
print(a)

# Sap xep mang 2 chieu voi cac hang tang dan
print("Mang sap xep theo hang tang dan")
b = np.sort(a) 
print(b)

Kết quả:

Mang ban dau
[[6 2 4]
 [5 0 1]
 [1 3 2]]
Mang sap xep theo hang tang dan
[[2 4 6]
 [0 1 5]
 [1 2 3]]

Lưu ý: Mặc định khi sử dụng hàm np.sort() để sắp xếp thì hàm này sẽ thực hiện sắp xếp tăng dần các phần tử có trong từng hàng.

Nếu như bạn cần sắp xếp tăng dần các phần tử có trong từng cột – khi đó ta cần truyền tham số axis = 0 vào trong hàm np.sort() như sau:

import numpy as np

# Mang a
a = np.array([
    [6, 2, 4], 
    [5, 0, 1],
    [1, 3, 2]
])
print("Mang ban dau")
print(a)

# Sap xep mang 2 chieu voi cac cot tang dan
b = np.sort(a, axis = 0)
print("Mang sap xep theo cot tang dan")
print(b)

Kết quả:

Mang ban dau
[[6 2 4]
 [5 0 1]
 [1 3 2]]
Mang sap xep theo cot tang dan
[[1 0 1]
 [5 2 2]
 [6 3 4]]

2. Sắp xếp mảng bằng np.argsort()

Hàm np.argsort() cũng được sử dụng để sắp xếp các phần tử trong mảng. Tuy nhiên, hàm này sẽ thực hiện sắp xếp gián tiếp trên mảng, dọc theo trục đã chỉ định và sử dụng kiểu sắp xếp cụ thể để trả về mảng mới sau khi sắp xếp thành công. Mảng mới này sẽ lưu các chỉ số phần tử sau khi sắp xếp.
Ví dụ dưới đây, sử dụng hàm np.argsort() để sắp xếp mảng 1 chiều theo trình tự các phần tử tăng dần theo giá trị như sau:
import numpy as np
  
# Mang a
a = np.array([2, 0, 1, 5, 4, 1, 9])
print("Mang a ban dau") 
print(a)

# Sap xep mang 1 chieu theo trinh tu tang dan  
b = np.argsort(a) # Mang b se luu cac chi so phan tu sau khi sap xep tang dan

print ("Chi so cac phan tu duoc sap xep tang dan")
print(b)

print("Mang sau khi sap xep tang dan")
print(a[b])

Kết quả:

Mang a ban dau
[2 0 1 5 4 1 9]
Chi so cac phan tu duoc sap xep tang dan
[1 2 5 0 4 3 6]
Mang sau khi sap xep tang dan
[0 1 1 2 4 5 9]

Lưu ý: Khi sử dụng hàm np.argsort() để sắp xếp, một mảng mới được tạo ra để lưu các chỉ số phần tử sau khi sắp xếp thành công. Vì vậy, khi cần lấy ra giá trị ta cần truyền mảng chỉ số này vào mảng ban đầu để truy cập được mảng sau khi sắp xếp (câu lệnh: print(a[b]))

Ví dụ tiếp theo, sử dụng hàm np.argsort() để sắp xếp mảng 2 chiều theo trục dọctheo trục ngang bằng cách thêm tham số axis = 0 (theo trục dọc) và axis = 1 (theo trục ngang) vào trong hàm np.argsort() như sau:

import numpy as np
  
# Mang a
a = np.array([
    [2, 0, 1], 
    [5, 4, 3],
    [1, 2, 6]
])
print("Mang a ban dau") 
print(a)

# Sap xep mang 2 chieu tang dan theo truc doc
b = np.argsort(a, axis=0) # Mang b se luu cac chi so phan tu sau khi sap xep tang dan
print ("Chi so cac phan tu duoc sap xep tang dan theo truc doc")
print(b)

# Sap xep mang 2 chieu tang dan theo truc ngang
b = np.argsort(a, axis=1) # Mang b se luu cac chi so phan tu sau khi sap xep tang dan
print ("Chi so cac phan tu duoc sap xep tang dan theo truc ngang")
print(b)

Kết quả:

Mang a ban dau
[[2 0 1]
 [5 4 3]
 [1 2 6]]
Chi so cac phan tu duoc sap xep tang dan theo truc doc
[[2 0 0]
 [0 2 1]
 [1 1 2]]
Chi so cac phan tu duoc sap xep tang dan theo truc ngang
[[1 2 0]
 [2 1 0]
 [0 1 2]]

Lưu ý: Chúng ta cũng có thể chỉ định thuật toán sắp xếp sẽ được sử dụng trong hàm np.argsort() bằng cách truyền thêm tham số kind vào hàm. Một số thuật toán sắp xếp hay sử dụng như: mergesort, quicksort, heapsort, selection sort….

import numpy as np
  
# Mang a
a = np.array([2, 0, 1, 5, 4, 1, 9])
print("Mang a ban dau") 
print(a)

# Sap xep mang tang dan voi thuat toan "quicksort"
b = np.argsort(a, kind="quicksort") 

print ("Chi so cac phan tu duoc sap xep tang dan")
print(b)

print("Mang sau khi sap xep tang dan")
print(a[b])

3. Sắp xếp mảng bằng np.lexsort()

Hàm np.lexsort() được sử dụng để sắp xếp mảng bằng cách sử dụng nhiều khóa sắp xếp liên quan đến nhiều hơn một mảng. Kết quả trả về sẽ là một mảng mới với các phần tử trong mảng mới này sẽ là chỉ số phần tử của mảng ban đầu sau khi được sắp xếp.

Khi áp dụng hàm np.lexsort() sẽ sắp xếp đầu tiên theo mảng a và sau đó theo mảng b ta nhận được kết quả sắp xếp là một mảng mới chứa chỉ số của các phần tử trong mảng a như ví dụ dưới đây:

import numpy as np
# Mang a va mang b ban dau
a = np.array([2,5,1,8,1]) 
b = np.array([9,0,3,2,0]) 
print("Mang a ban dau")
print(a)
print("Mang b ban dau")
print(b)

# Sap xep mang a sau do sap xep mang b
c = np.lexsort((b,a))
print("Chi so cac phan tu sau khi sap xep tang dan cua mang a")
print(c)

# In cac cap phan tu trong mot cap mang a, b
print([(a[i],b[i]) for i in c])

Kết quả:

Mang a ban dau
[2 5 1 8 1]
Mang b ban dau
[9 0 3 2 0]
Chi so cac phan tu sau khi sap xep tang dan cua mang a
[4 2 0 1 3]
[(1, 0), (1, 3), (2, 9), (5, 0), (8, 2)]