Tin học - Bài 21: Từ list tới mảng numpy (Khoa học Dữ liệu & ML)

Bài 21: Từ list tới mảng numpy — nền tảng của Khoa học Dữ liệu

🎯 Sau bài này bạn sẽ:
• Hiểu vì sao dân khoa học dữ liệu dùng numpy thay cho list.
• Tạo được mảng và làm phép tính trên cả mảng cùng lúc (vectorization).
• Tự chạy numpy ngay trong trình duyệt này.
List Python (từng phần tử)Mảng numpy (cả khối)123×2246cần vòng lặp, làm từng ô123×2246một lệnh: a × 2Cùng kết quả [2,4,6] — numpy viết gọn và chạy nhanh hơn
numpy làm phép tính trên cả mảng cùng lúc (vectorization), thay vì lặp từng phần tử.

1. Vấn đề: list Python chậm với dữ liệu lớn

🟢 Lớp A · Trực giác
Hãy tưởng tượng bạn có một triệu con số và muốn nhân đôi tất cả. Với list, Python phải cầm từng số một, nhân, rồi bỏ lại — làm một triệu lần. Giống như phát kẹo cho cả trường bằng cách gọi tên từng bạn. numpy thì như đổ cả thùng kẹo xuống một lượt.
🔵 Lớp B · Cơ chế
List là danh sách các đối tượng Python rời rạc, nằm rải rác trong bộ nhớ. Mỗi phép tính phải qua vòng lặp diễn giải (interpreter) chậm. numpy lưu số liền khối, cùng kiểu, và gọi mã C/Fortran đã tối ưu — nên nhanh hơn nhiều lần.
# Cach cu (list): phai lap
nhan_doi = []
for x in so_list:
    nhan_doi.append(x * 2)
🟣 Lớp C · Nghiên cứu
Trong nghiên cứu, dữ liệu thật thường có hàng triệu dòng (ảnh, tín hiệu, bảng đo). Viết vòng lặp Python thuần sẽ chậm tới mức không dùng được. numpy (và pandas ở bài sau) là ngôn ngữ chung mà gần như mọi thư viện ML/DL đều dựa vào — nắm vững nó là điều kiện cần để đọc và tái lập code của người khác.

2. Giải pháp: mảng numpy và phép tính vector hoá

🟢 Lớp A · Trực giác
Với numpy, bạn nói "nhân cả mảng với 2" trong một câu, và máy tự làm cho mọi phần tử. Ngắn gọn, dễ đọc, lại nhanh.
import numpy as np
a = np.array([1, 2, 3, 4])
nhan_doi = a * 2      # -> [2 4 6 8], khong can vong lap
cong_them = a + 10     # -> [11 12 13 14]
🔵 Lớp B · Cơ chế
Phép a * 2 gọi là broadcasting: numpy "nhân bản" số 2 ra cho khớp hình dạng mảng rồi nhân từng cặp. Vì thao tác chạy trong tầng biên dịch sẵn, nó vừa gọn cú pháp vừa nhanh — đây gọi là vectorization (vector hoá).
Tốc độ khi xử lý 1 triệu số (minh họa)List + forchậmnumpynhanhnumpy dùng mã tối ưu bên dưới nên nhanh hơn nhiều lần
Với dữ liệu lớn, numpy nhanh hơn vòng lặp Python hàng chục đến hàng trăm lần.

3. Những phép tính "cả mảng" hay dùng

🟢 Lớp A · Trực giác
numpy có sẵn các lệnh tính nhanh trên cả mảng: tổng, trung bình, lớn nhất, nhỏ nhất... Không cần tự viết vòng lặp.
a = np.array([10, 20, 30, 40])
a.sum()    # 100
a.mean()   # 25.0  (trung binh cong)
a.max()    # 40
a.min()    # 10
🟣 Lớp C · Nghiên cứu
Các phép "gộp" (aggregate) này chính là nền của thống kê mô tả — bước đầu tiên khi khám phá bất kỳ bộ dữ liệu nghiên cứu nào. Ở Chặng 8 ta sẽ thấy trung bình & độ lệch chuẩn được dùng để chuẩn hoá dữ liệu trước khi đưa vào mô hình.

4. Lọc dữ liệu bằng điều kiện (mảng boolean)

🟢 Lớp A · Trực giác
Bạn có thể hỏi cả mảng một câu hỏi — ví dụ "số nào lớn hơn 20?" — và numpy trả về đúng những số đó.
a = np.array([10, 25, 30, 15])
a[a > 20]   # -> [25 30]  (chi lay so > 20)
🔵 Lớp B · Cơ chế
Biểu thức a > 20 tạo một mảng đúng/sai (True/False) cùng kích thước. Đặt nó trong ngoặc vuông, numpy chỉ giữ lại phần tử ứng với True. Kỹ thuật này gọi là boolean masking — cực kỳ hay dùng để lọc dữ liệu.

📚 Bảng ghi nhớ

Việc muốn làmnumpy
Tạo mảng từ listnp.array([1, 2, 3])
Nhân đôi cả mảnga * 2
Tổng / trung bìnha.sum() / a.mean()
Lớn nhất / nhỏ nhấta.max() / a.min()
Lọc theo điều kiệna[a > 20]

✎ Câu hỏi trắc nghiệm

Câu 1. Vì sao dân khoa học dữ liệu thích dùng numpy hơn list Python cho dữ liệu lớn?

numpy lưu số liền khối và dùng mã tối ưu bên dưới → vector hoá, vừa gọn cú pháp vừa nhanh hơn vòng lặp nhiều lần.

Câu 2. Với a = np.array([1, 2, 3]), kết quả của a * 2 là gì?

Với mảng numpy, * 2 nhân từng phần tử → [2, 4, 6]. (Với list thường, * 2 mới lặp đôi danh sách.)

Câu 3. Với a = np.array([10, 20, 30]), lệnh a.mean() trả về?

mean là trung bình cộng: (10 + 20 + 30) ÷ 3 = 20.0. (a.sum() mới cho 60.)

Câu 4. Với a = np.array([10, 25, 30, 15]), biểu thức a[a > 20] cho ra gì?

a > 20 tạo mảng True/False, rồi giữ lại phần tử ứng với True → [25, 30]. Đây là boolean masking.

Câu 5. "Vectorization" (vector hoá) nghĩa là gì?

Vectorization = diễn đạt phép tính trên toàn bộ mảng trong một lệnh, để máy chạy tối ưu – nền tảng của numpy.
💻 Phòng thí nghiệm numpy (chạy thật trong trình duyệt!):
Lần đầu, bấm ▶ Khởi động Python để tải numpy (chờ vài giây). Sau đó bấm Chạy để thực thi code numpy thật. Thử sửa mảng, đổi phép tính rồi chạy lại nhé!
🔌 Python chưa khởi động. Bấm "Khởi động Python" để bắt đầu.
(Kết quả sẽ hiện ở đây sau khi khởi động Python)
🎉 Thử thách: Tạo mảng diem = np.array([7, 4, 9, 6, 3, 8]). Hãy in ra điểm trung bình, và lọc ra những điểm >= 5 (đạt). Gợi ý: dùng diem.mean()diem[diem >= 5].