NumPy hỗ trợ 3 kiểu indexing: field access, basic slicing, advanced indexing. Bài viết tập trung vào slicing và advanced indexing.
Basic Slicing
Mở rộng slicing Python sang n chiều. Cú pháp: arr[start:stop:step] hoặc dùng slice() object.
Ví dụ 1: slice object
import numpy as np arr = np.arange(25) s = slice(2, 21, 4) print(arr[s]) # [ 2 6 10 14 18]
Ví dụ 2: Cú pháp trực tiếp
arr = np.arange(25) print(arr[2:21:4]) # [ 2 6 10 14 18]
Các trường hợp phổ biến
arr = np.arange(10) print(arr[9]) # 9 (single item) print(arr[3:]) # [3 4 5 6 7 8 9] (từ index 3) print(arr[3:7]) # [3 4 5 6] (index 3-6) # Multi-dimensional arr = np.array([[[1],[2],[3]], [[4],[5],[6]], [[7],[8],[9]]]) print(arr[1:]) # [[[4] [5] [6]] [[7] [8] [9]]]
Advanced Indexing
1. Integer Array Indexing
Chọn phần tử bằng mảng index.
arr = np.array([[1,2], [3,4], [5,6]]) print(arr) # [[1 2] # [3 4] # [5 6]] # Chọn (row, col): (0,1), (1,0), (2,1) print(arr[[0, 1, 2], [1, 0, 1]]) # [2 3 6] # Chọn 1 phần tử (giữ shape) print(arr[[1], [1]]) # [4] # Phép toán trên phần tử được chọn print(arr[[1], [1]] + 1) # [5] (arr không đổi) arr[[1], [1]] += 1 # arr thay đổi: [[1,2], [3,5], [5,6]]
2. Boolean Indexing
Lọc phần tử theo điều kiện boolean.
arr = np.array([[0,1,2], [3,4,5], [6,7,8], [9,10,11]]) # Phần tử == 1 print(arr[arr == 1]) # [1] # Phần tử chẵn print(arr[arr % 2 == 0]) # [ 0 2 4 6 8 10] # Kết hợp điều kiện print(arr[(arr > 3) & (arr < 9)]) # [4 5 6 7 8]
Tóm tắt
| Basic Slicing | View (chia sẻ memory), cú pháp start:stop:step, hiệu quả cao |
| Integer Indexing | Copy (tạo mảng mới), chọn index tùy ý |
| Boolean Indexing | Copy, lọc theo điều kiện logic |
Lưu ý quan trọng
- Slicing trả về view (thay đổi view ảnh hưởng array gốc)
- Advanced indexing trả về copy (an toàn, nhưng tốn memory)
- Dùng
np.copy()nếu cần copy thật từ slice