Tạo Cửa Sổ Trượt Zero-Copy Bằng Kỹ Thuật Strides Trong NumPy
Khi trích xuất cửa sổ trượt (sliding window) kích thước W từ một mảng âm thanh hoặc chuỗi thời gian có 100 triệu phần tử, nếu tạo mảng mới bằng vòng lặp sao chép (copy), hệ thống s…
Tiến độ của tôi ở bài này
Điểm được lưu vào tài khoản sau khi chấm bài.
Đang tải điểm của bạn…
Kiến thức và chủ đề
Kiến thức tiên quyết: ndarray strides, as strided, memory layout.
Nội dung đề bài
Mục tiêu kiến thức
- Hiểu sâu cấu trúc bộ nhớ nội bộ của
np.ndarray: con trỏ dữ liệudata, kích thướcshapevà bước nhảy bytestrides. - Nắm vững sự khác biệt bản chất giữa View (chung vùng nhớ) và Copy (sao chép độc lập).
- Sử dụng công cụ
np.lib.stride_tricks.as_stridedđể tạo ma trận cửa sổ trượt mà không tốn thêm bất kỳ byte bộ nhớ nào.
Mô tả bài toán
Khi trích xuất cửa sổ trượt (sliding window) kích thước W từ một mảng âm thanh hoặc chuỗi thời gian có 100 triệu phần tử, nếu tạo mảng mới bằng vòng lặp sao chép (copy), hệ thống sẽ cạn kiệt RAM ngay lập tức. Bằng cách thao tác trên strides, ta có thể tạo ra một View 2 chiều nhìn vào mảng 1 chiều gốc với chi phí bộ nhớ O(1).
Hãy viết hàm: sliding_window_view_1d(arr: np.ndarray, window_size: int, step: int = 1) -> np.ndarray
Quy tắc:
- Kiểm tra tính hợp lệ:
- Nếu
arr.ndim != 1: ném ngoại lệValueError("arr phai la mang 1 chieu"). - Nếu
window_size <= 0hoặcstep <= 0: ném ngoại lệValueError("window_size va step phai lon hon 0"). - Tính toán kích thước và bước nhảy:
- Nếu
len(arr) < window_size: trả về mảng rỗng 2 chiều có shape(0, window_size)cùngdtypevớiarr. - Số lượng cửa sổ $K = ⌊ len(arr) - window_sizestep
floor + 1$.
- Shape của mảng kết quả:
(K, window_size). - Bước nhảy
new_strides: - Chiều 0 (dịch sang cửa sổ tiếp theo): nhảy
step * arr.strides[0]bytes. - Chiều 1 (các phần tử trong cùng một cửa sổ): nhảy
arr.strides[0]bytes. - Tính chất Zero-Copy bắt buộc:
- Mảng trả về phải chia sẻ vùng nhớ với
arr(np.shares_memory(result, arr) == True). Tuyệt đối không sao chép dữ liệu.
Input
- Các tham số truyền vào hàm/lớp sliding_window_view_1d hoặc dữ liệu đầu vào theo định dạng mô tả.
Output
- Kết quả trả về của hàm/lớp sliding_window_view_1d hoặc dữ liệu in ra màn hình theo đúng đặc tả.
Ràng buộc
- Mảng đầu vào 1 chiều liên tục trong bộ nhớ (
arr.flags.c_contiguous == True). - Thời gian chạy tối đa: 1000ms.
- Giới hạn bộ nhớ: 256MB.
Ví dụ 1
Input
sliding_window_view_1d(arr=[1, 2, 3, 4, 5, 6], window_size=3, step=2)Output
[[1, 2, 3], [3, 4, 5]]Giải thích
Hàm được gọi với các tham số mẫu trên và trả về kết quả chính xác theo yêu cầu.
Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.
Góp ý & báo lỗi bài tập
Đề bài chưa rõ, test có vấn đề hay bạn có ý tưởng giúp bài tốt hơn? Gửi cho đội ngũ AI Empire nhé — mỗi góp ý đều được đọc.
