Broadcasting

Bài 4/620 phút

Broadcasting cho phép tính toán giữa hai mảng khác shape mà không cần sao chép. NumPy so sánh shape từ phải sang trái; hai chiều tương thích khi bằng nhau hoặc một trong hai bằng 1 (chiều bằng 1 được "kéo giãn").

broadcasting.py
X = np.ones((4, 3))          # 4 mẫu, 3 đặc trưng
mu = X.mean(axis=0)          # shape (3,)
X - mu                        # (4,3) - (3,) → (4,3): trừ mean cho mỗi hàng

row_max = X.max(axis=1, keepdims=True)   # (4, 1)
X - row_max                   # (4,3) - (4,1) → (4,3): trừ max của từng hàng

# Khoảng cách mọi cặp điểm, không vòng lặp:
A = np.random.rand(5, 2); B = np.random.rand(3, 2)
diff = A[:, None, :] - B[None, :, :]     # (5,1,2) - (1,3,2) → (5,3,2)
D = np.sqrt((diff ** 2).sum(-1))           # (5, 3)

None (hoặc np.newaxis) thêm một chiều độ dài 1 — công cụ chính để "căn" hai mảng cho broadcasting. keepdims=True giữ lại chiều đã gộp với độ dài 1 cũng vì lý do này. Đây chính là mẹo trong softmax ổn định số: x - x.max(axis=-1, keepdims=True).

?Phép (8, 1, 5) + (3, 1) cho kết quả shape gì?