Trong bài này chúng ta sẽ cùng tìm hiểu thư viện NumPy trong Python: NumPy là gì, tại sao nên dùng, cách cài đặt, các kiểu dữ liệu, cách tạo mảng và truy xuất phần tử trong mảng.
NumPy gần như là thư viện đầu tiên ai làm Python về dữ liệu, AI hay xử lý tín hiệu cũng phải cài. Các thư viện lớn như Pandas, Matplotlib, Scikit-learn mà mình sẽ giới thiệu ở các bài sau đều xây dựng trên nền NumPy, nên nắm chắc bài này trước nhé.
Thư viện NumPy trong Python là gì?
NumPy (Numerical Python) là thư viện mã nguồn mở của Python, chuyên dùng để xử lý dữ liệu số và tính toán.
Cốt lõi của NumPy là đối tượng mảng nhiều chiều (ndarray), đi kèm rất nhiều hàm để tính toán trên mảng đó: cộng trừ nhân chia cả mảng, đại số tuyến tính, thống kê, sinh số ngẫu nhiên…

Tính năng chính của NumPy
Một số tính năng chính của NumPy:
-
Mảng nhiều chiều (ndarray): lưu trữ dữ liệu số gọn và nhanh hơn list của Python.
-
Phép toán trên mảng: tính toán trên cả mảng hoặc theo từng trục (hàng, cột) mà không cần viết vòng lặp.
-
Sinh số ngẫu nhiên: tạo mảng ngẫu nhiên và xáo trộn phần tử.
-
Đại số tuyến tính và thống kê: nhân ma trận, nghịch đảo, trung bình, độ lệch chuẩn…
Lý do bạn phải dùng thư viện NumPy trong Python
Python thuần dùng list để lưu danh sách dữ liệu. List rất linh hoạt, chứa được đủ loại kiểu dữ liệu, nhưng đổi lại tính toán trên list chậm hơn rất nhiều.
Mảng NumPy thì ngược lại: các phần tử cùng một kiểu, nằm liền nhau trong bộ nhớ giống mảng trong C, và phần tính toán được viết bằng C bên dưới. Kết quả là xử lý mảng vài triệu phần tử bằng NumPy có thể nhanh hơn list hàng chục lần. Vì vậy với dữ liệu dạng mảng hay ma trận, gần như ai cũng dùng NumPy.

Làm sao để cài đặt NumPy?
NumPy không có sẵn khi cài Python, chúng ta cài thêm bằng pip (trình quản lý package của Python):
- Mở terminal/command prompt, chạy lệnh dưới để nâng pip lên bản mới nhất.
pip install --upgrade pip
- Chạy lệnh cài NumPy:
pip install numpy
Nếu cần cài đúng một phiên bản cụ thể, thêm số phiên bản vào cuối lệnh:
pip install numpy==1.20.3
Lưu ý: Mỗi bản NumPy chỉ hỗ trợ một số phiên bản Python nhất định. Cài một bản NumPy cũ trên Python mới (hoặc ngược lại) thì pip sẽ báo lỗi build rất dài. Gặp lỗi này thì cứ bỏ số phiên bản đi, để pip tự chọn bản phù hợp với Python của bạn.
Các kiểu dữ liệu trong NumPy
Mỗi mảng NumPy có một kiểu dữ liệu (dtype) chung cho tất cả phần tử. Có thể chia làm 2 nhóm: kiểu không phải số và kiểu số.
1. Kiểu không số
-
Boolean: giá trị True hoặc False.
-
String: chuỗi ký tự.
-
Object: đối tượng Python bất kỳ.
2. Kiểu số
-
Integer: số nguyên, gồm các kiểu int8, int16, int32, int64…
-
Floating-point: số thực, gồm float16, float32, float64.
-
Complex: số phức, gồm complex64 và complex128.

Ví dụ tạo mảng với từng kiểu dữ liệu:
import numpy as np
# Kiểu số
arr_int = np.array([1, 2, 3], dtype=np.int32)
arr_float = np.array([1.0, 2.0, 3.0], dtype=np.float32)
arr_complex = np.array([1+2j, 3+4j], dtype=np.complex64)
# Kiểu không số
arr_bool = np.array([True, False, True], dtype=bool)
arr_str = np.array(['hello', 'world'], dtype=str)
arr_obj = np.array([{'name': 'John'}, {'name': 'Alice'}], dtype=object)
Lưu ý: Nhiều tài liệu cũ trên mạng viết dtype=np.str hay dtype=np.object. Các tên này đã bị xóa từ NumPy 1.24, chạy sẽ báo AttributeError. Dùng thẳng bool, str, object của Python như ví dụ trên là chạy được trên mọi phiên bản.
Người làm nhúng sẽ thấy int8, int16, int32 rất quen, giống hệt int8_t, int16_t, int32_t trong C. Khi xử lý dữ liệu đọc từ cảm biến hay ADC gửi lên qua UART, chọn đúng dtype sẽ tiết kiệm bộ nhớ đáng kể.
Thế nào là mảng trong Numpy?
Mảng (array) là đối tượng cơ bản nhất của NumPy, dùng để lưu các giá trị cùng kiểu dữ liệu. Mảng có thể là một chiều (giống list), hai chiều (giống ma trận, bảng) hoặc nhiều chiều hơn.
Ví dụ 1: mảng một chiều.
import numpy as np arr = np.array([1, 2, 3, 4, 5]) print(arr)
Kết quả:
[1 2 3 4 5]
Ví dụ 2: mảng hai chiều, gồm 2 hàng 3 cột.
import numpy as np arr = np.array([[1, 2, 3], [4, 5, 6]]) print(arr)
Kết quả:
[[1 2 3] [4 5 6]]
Để ý mảng NumPy in ra không có dấu phẩy giữa các phần tử, khác với list. Nhìn vào là biết ngay đây là mảng NumPy hay list thường.
Array Indexing của NumPy trong Python
Truy xuất phần tử trong mảng NumPy bằng chỉ số (index), bắt đầu từ 0 giống C.
Ví dụ:
import numpy as np arr = np.array([1, 2, 3, 4, 5]) print(arr[0]) # Output: 1
Muốn lấy một đoạn của mảng thì dùng slice [bắt_đầu:kết_thúc]. Phần tử ở vị trí kết thúc không được lấy. Ví dụ lấy phần tử thứ 2 đến thứ 4 (chỉ số 1, 2, 3):
import numpy as np arr = np.array([1, 2, 3, 4, 5]) print(arr[1:4]) # Output: [2 3 4]
Với mảng nhiều chiều, chỉ số và slice của từng chiều cách nhau bằng dấu phẩy:
import numpy as np arr = np.array([[1, 2, 3], [4, 5, 6]]) print(arr[0, 1]) # Output: 2 print(arr[:, 1:3]) # Output: # [[2 3] # [5 6]]
arr[0, 1] là phần tử ở hàng 0, cột 1, tức là số 2. Còn arr[:, 1:3] nghĩa là lấy tất cả các hàng (dấu : đứng một mình), và cột từ 1 đến 2. Kết quả là cột thứ hai và thứ ba của mảng.
Lời kết
NumPy là nền tảng của gần như toàn bộ hệ sinh thái xử lý dữ liệu trong Python. Chỉ cần nắm được cách tạo mảng, dtype và cách truy xuất bằng index, slice là các bạn đã đủ để học tiếp Pandas và Matplotlib rồi.
Nếu thấy bài viết này hay, hãy chia sẻ tới những người bạn đang học Python nhé. Và nếu thắc mắc điều gì, hãy để lại bình luận bên dưới.

