1. Kỹ thuật Slicing mảng Numpy

Slicing là kỹ thuật lấy ra các phần tử từ một một vị trí chỉ mục bắt đầu, đến phần tử có chỉ mục có vị trí chỉ mục kết thúc cần lấy ra. Chúng ta có thể lấy ra các phần tử trong mảng từ chỉ mục bắt đầu đến chỉ mục kết thúc thông qua việc khai báo: [start:end]

Ví dụ dưới đây, lấy ra các phần tử có trong mảng Numpy có chỉ mục bắt đầu tử 1 đến chỉ mục kết thúc bằng bằng cách khai báo [1:5] cho mảng cần Slicing.

import numpy as np 

arrA = np.array([5, 8, 3, 1, 9, 6, 2]) 

# Lay ra cac phan tu chi muc 1 den 5 
print(arrA[1:5])

Kết quả:

[8 3 1 9]

Chú ý: Các phần tử có chỉ mục bắt đầu sẽ được thêm vào kết quả, thế nhưng các chỉ mục tại chỉ mục kết thúc sẽ không được thêm vào kết quả! Vì vậy, khi Slicing [1:5] ở mảng trên, ta chỉ nhận được kết quả: [8 3 1 9]

Nếu như không truyền vào chỉ mục kết thúc cho Slicing, khi đó kết quả sẽ là các phần tử có chỉ mục bắt đầu Slicing đến phần tử cuối cùng có trong mảng.

import numpy as np 

arrA = np.array([5, 8, 3, 1, 9, 6, 2]) 

# Lay ra cac phan tu chi muc 2 den het mang 
print(arrA[2:])

Kết quả:

[3 1 9 6 2]

Nếu như không truyền vào chỉ mục bắt đầu cho Slicing, khi đó kết quả sẽ là phần tử đầu tiên trong mảng cho đến các phần tử có chỉ mục kết thúc trong Slicing.

import numpy as np 

arrA = np.array([5, 8, 3, 1, 9, 6, 2]) 

# Lay ra cac phan tu tai chi muc dau tien den chi muc 5
print(arrA[:5])

Kết quả:

[5 8 3 1 9]

2. Slicing mảng Numpy theo bước nhảy

Chúng ta có thể Slicing các phần tử có chỉ mục của một mảng Numpy theo bước nhảy. Bằng cách khai báo theo cú pháp Slicing [start:end:step]

Khi Slicing kiểu này sẽ đồng nghĩa với việc lấy chỉ mục của phần tử trước cộng cho bước nhảy để lấy ra phần tử cần cắt. Ví dụ: start = 0; end = 5; step = 2 khi đó sẽ việc Slicing sẽ lấy ra phần tử có chỉ mục 0, tiếp theo sẽ là phần tử có chỉ mục 2, cuối cùng sẽ lấy ra phần tử có chỉ mục 4

import numpy as np 

arrA = np.array([5, 8, 3, 1, 9, 6, 2]) 

# Slicing voi 2 buoc nhay tu chi muc 0 den chi muc 5
print(arrA[0:5:2])

Kết quả:

[5 3 9]

Nếu như bạn muốn lấy ra các phần tử có chỉ mục cách nhau 2 bước nhảy trong toàn bộ mảng, khí đó bạn chỉ cần sử dụng Slicing [::2]. Ví dụ, start = ; end = ; step = 2 khi đó sẽ việc Slicing sẽ lấy ra phần tử có chỉ mục 0, tiếp theo sẽ là phần tử có chỉ mục 2, tiếp theo là phần tử có chỉ mục 4, tiếp theo là phần tử có chỉ mục 6…… 

import numpy as np 

arrA = np.array([5, 8, 3, 1, 9, 6, 2]) 

# Slicing voi 2 buoc nhay trong toan bo mang
print(arrA[::2])

Kết quả:

[5 3 9 2]

3. Slicing với mảng hai chiều (2-D) trong Numpy

Chúng ta cũng có thể sử dụng Slicing với một mảng hai chiều Numpy. Khi sử dụng Slicing trong mảng 2 chiều ta cần xác định được vị trí hàng bắt đầu cắt, vị trí hàng kết thúc cắt và vị trí cột bắt đầu cắt, vị trị cột kết thúc cắt.

Khi Slicing mảng hai chiều ta sẽ sử dụng khai báo Slicing [row_start:row_end, col_start:col_end]

Ví dụ dưới đây, sẽ cắt ra các phần tử từ hàng 1 đến hàng 3 và các cột từ 2 đến cột 4. Nghĩa là Slicing [1:3, 2:4] như sau:

import numpy as np

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

# Mang ban dau
print("Mang ban dau")
print(arrA)

print("Mang sau khi slicing")
# Cat tu hang 1 den hang 3 va tu cot 2 den cot 4
print(arrA[1:3, 2:4])

Kết quả:

Mang ban dau
[[5 8 9 2 1 0]
 [3 5 2 0 7 9]
 [0 2 4 5 2 3]
 [7 6 0 8 3 5]
 [1 5 7 3 4 6]]
Mang sau khi slicing
[[2 0]
 [4 5]]

Chú ý: Khi Slicing với mảng 2 chiều, các hàng kết thúc cắt và cột kết thúc cắt sẽ không được thêm vào kết quả! Vì vậy, kết quả trên khi Slicing [1:3, 2:4] sẽ chỉ lấy ra hàng từ 1 đến 2 và cột từ 2 đến 3.

Ví dụ tiếp theo, sẽ chỉ cắt ra phần tử của hàng 1 và các cột từ 2 đến 4. Nghĩa là Slicing [1, 2:4] như sau:

import numpy as np

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

# Mang ban dau
print("Mang ban dau")
print(arrA)

print("Mang sau khi slicing")
# Cat hang 1 va cot 2 den cot 4
print(arrA[1, 2:4])

Kết quả:

Mang ban dau
[[5 8 9 2 1 0]
 [3 5 2 0 7 9]
 [0 2 4 5 2 3]
 [7 6 0 8 3 5]
 [1 5 7 3 4 6]]
Mang sau khi slicing
[2 0]