Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Slicing cơ bản và Advanced Indexing trong NumPy Python

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 SlicingView (chia sẻ memory), cú pháp start:stop:step, hiệu quả cao
Integer IndexingCopy (tạo mảng mới), chọn index tùy ý
Boolean IndexingCopy, 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