Ma trận và bảng dữ liệu trong thuật toán
Làm chủ ma trận và bảng dữ liệu dạng hàng cột cùng độ phức tạp thao tác: hàng là điểm dữ liệu, cột là thuộc tính, trục xác định hướng tính toán.
DễCấu trúc dữ liệu ~45 phút
Ôn lại trước khi học
Giới thiệu
Bài này học bảng hàng-cột và ma trận số. Bạn lọc đúng hàng cột cần dùng.
Kiến thức cần nhớ
Bảng dữ liệu hàng và cột
- Mỗi hàng là 1 điểm dữ liệu.
- Mỗi cột là 1 thuộc tính.
- Gọi tên cột là lấy được cột.
- Ví dụ đời thường: bảng lương mỗi dòng 1 nhân viên.
Lọc cột và lọc hàng
- Lọc cột là chọn vài cột quan tâm.
- Lọc hàng là chọn hàng thỏa điều kiện.
- Kết hợp cả 2 được lát cắt chính xác.
- Ví dụ đời thường: lọc học sinh giỏi toán.
- Chọn đặc trưng là lọc cột, chọn mẫu là lọc hàng.
Ma trận và chi phí
- Ma trận là bảng số chữ nhật.
- Cộng 2 ma trận thì duyệt từng ô.
- Nhân 2 ma trận rất đắt, bậc 3.
- Ví dụ đời thường: bảng điểm nhân trọng số.
- Lưu theo cột thì thêm cột chỉ tốn để tạo dữ liệu cột mới, không phải chép lại cả bảng.
| Thao tác bảng | Chi phí thường |
|---|---|
| Chọn cột theo tên | |
| Thêm cột mới | cho cột mới |
| Lọc hàng | theo số hàng |
| Cộng ma trận | Theo số ô |
Ví dụ
- Input: bảng 3 nhân viên, trích cột lương. Output: đúng 3 con số đúng thứ tự.
- Giải thích: gọi tên cột là lấy được vector cột.
💻 Bài tập
Ngôn ngữ: Python 3, chỉ dùng thư viện chuẩn (csv) cho Bài 1-2. Bài 3 dùng thêm NumPy. Nộp vào day-014/.
Tạo file employees.csv:
name,dept,salary,years
An,IT,25000000,3
Bình,HR,15000000,5
Chi,IT,32000000,7
Dũng,Sales,18000000,2
Hà,IT,21000000,1
Khoa,Sales,27000000,6
Bài 1: Lớp Table tối giản
Cài Table lưu dữ liệu theo cột: dict[str, list].
| Phương thức | Yêu cầu |
|---|---|
Table.from_csv(path) | Đọc file, tự đổi cột số thành int |
shape() | Trả (số hàng, số cột) |
column(name) | Trả list giá trị của cột. Sai tên thì KeyError rõ ràng |
select(*names) | Trả Table mới chỉ có các cột đó |
where(pred) | pred nhận dict một hàng, trả Table mới gồm hàng thỏa |
add_column(name, values) | Thêm cột. Sai độ dài thì ValueError |
row(i) | Trả dict của hàng i |
t.shape() -> (6, 4)
t.column("salary")[:2] -> [25000000, 15000000]
t.where(lambda r: r["salary"] > 20e6).shape() -> (4, 4)
t.select("name", "dept").shape() -> (6, 2)
Bài 2: Group-by và xếp loại
group_mean(table, key, value)trả dict trung bình theo nhóm.group_mean(t, "dept", "salary")["IT"]=26000000.- Thêm cột
level:years >= 5là"senior",>= 2là"mid", còn lại"junior". - In bảng dạng text căn cột thẳng hàng.
Bài 3: Ma trận (nâng cao)
- Tự viết
mat_add(A, B)vàmat_mul(A, B)bằng list lồng nhau. Sai kích thước thìValueError. - Đếm số phép nhân trong
mat_mulcho ma trận . Kiểm tra bằng . - Đo thời gian
mat_multự viết vànumpy.matmulvới .
mat_add([[1,2],[3,4]], [[5,6],[7,8]]) -> [[6,8],[10,12]]
mat_mul([[1,2],[3,4]], [[5,6],[7,8]]) -> [[19,22],[43,50]]
✅ Tiêu chí hoàn thành
- Test mẫu viết bằng
asserttrongtest_table.pypass. -
wherevàselecttrả bảng mới, không sửa bảng gốc. - Bảng thời gian Bài 3 có số thật và 2 câu giải thích vì sao NumPy nhanh hơn.
- Giải thích được vì sao lưu theo cột giúp
column()rẻ, cònrow()đắt hơn.
❓ Câu hỏi ôn tập
- Hàng và cột trong bảng là gì?
- Lọc cột khác lọc hàng thế nào?
- Thêm cột tốn bao nhiêu?
- Ma trận nhân nhau có đắt không?
🌕 Bạn đã hoàn thành ngày 14. Làm hết bài tập phía trên rồi sang ngày tiếp theo.