python-034Đọc toàn bộ đề miễn phí

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…

PythonNâng cao35 phút

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ủ đề

numpystridesmemory viewszero copy

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ệu data, kích thước shape và bước nhảy byte strides.
  • 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 <= 0 hoặc step <= 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ùng dtype với arr.
  • 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.

3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

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.