Indexing, slicing và mặt nạ boolean

Bài 2/615 phút

chi_so.py
m = np.arange(12).reshape(3, 4)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

m[1, 2]        # 6        — hàng 1, cột 2
m[0]           # [0 1 2 3] — cả hàng 0
m[:, 1]        # [1 5 9]  — cả cột 1
m[:2, 1:3]     # [[1 2] [5 6]] — khối con
m[::-1]        # đảo thứ tự hàng

Mặt nạ boolean lọc phần tử theo điều kiện — cực kỳ hay dùng khi xử lý dữ liệu:

mat_na.py
x = np.array([3, -1, 4, -1, 5])
mask = x > 0              # [ True False  True False  True]
print(x[mask])            # [3 4 5]
x[x < 0] = 0              # gán 0 cho phần tử âm → giống ReLU!

# fancy indexing: lấy theo danh sách chỉ số
probs = np.array([[0.1, 0.9], [0.8, 0.2]])
labels = np.array([1, 0])
print(probs[np.arange(2), labels])   # [0.9 0.8] — xác suất của nhãn đúng

Slicing (m[:2]) trả về view — sửa view là sửa luôn mảng gốc. Fancy indexing và mặt nạ trả về bản sao. Cần bản sao độc lập thì dùng .copy().

?Với m có shape (3, 4), m[:, -1] trả về gì?