Sử dụng mảng NumPy cho phép lập trình viên thực hiện các tác vụ xử lý dữ liệu phức tạp thông qua các biểu thức mảng ngắn gọn thay vì sử dụng các vòng lặp truyền thống. Kỹ thuật này được gọi là
vectorization (vector hóa), giúp tối ưu hóa hiệu suất và làm cho mã nguồn trở nên sạch sẽ hơn.
Một ví dụ điển hình là tính toán giá trị hàm số trên một lưới tọa độ. Giả sử chúng ta muốn tính giá trị $\sqrt{x^2 + y^2}$ cho các cặp điểm (x, y). Hàm
np.meshgrid sẽ hỗ trợ tạo ra các ma trận tọa độ từ các mảng một chiều.
import numpy as np
x_coords = np.array([10, 20, 30])
y_coords = np.array([5, 15, 25])
# Tạo lưới tọa độ
grid_x, grid_y = np.meshgrid(x_coords, y_coords)
# Thực hiện tính toán vector hóa
distances = np.sqrt(grid_x**2 + grid_y**2)
print(grid_x)
# [[10 20 30]
# [10 20 30]
# [10 20 30]]
print(distances)
# [[11.18033989 20.61552813 30.41381265]
# [18.02775638 25. 33.54101966]
# [26.92582404 32.01562119 39.05124838]]
Áp dụng logic điều kiện với mảng
Hàm
np.where là phiên bản vector hóa của biểu thức ba ngôi
x if condition else y trong Python. Nó cho phép lựa chọn phần tử từ hai mảng dựa trên một mảng điều kiện.
val_a = np.array([1, 5, 10, 15])
val_b = np.array([-1, -5, -10, -15])
selector = np.array([True, False, True, False])
# Lấy từ val_a nếu True, ngược lại lấy từ val_b
out = np.where(selector, val_a, val_b)
print(out)
# [ 1 -5 10 -15]
np.where cũng rất hữu dụng trong việc làm sạch dữ liệu, ví dụ như thay thế các giá trị âm bằng 0 hoặc một hằng số cụ thể:
data = np.random.randn(3, 3)
print(data)
# Thay thế các giá trị dương thành 1, còn lại giữ nguyên giá trị cũ
cleaned_data = np.where(data > 0, 1, data)
print(cleaned_data)
Các phương thức thống kê và toán học
NumPy cung cấp các hàm tập hợp (aggregations) để tính toán trên toàn bộ mảng hoặc dọc theo một trục (axis) xác định.
matrix = np.arange(12).reshape(3, 4)
print(matrix)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
print(matrix.mean()) # Trung bình cộng toàn bộ ma trận: 5.5
print(matrix.sum(axis=0)) # Tổng theo cột: [12 15 18 21]
print(matrix.sum(axis=1)) # Tổng theo hàng: [ 6 22 38]
Dưới đây là các hàm thống kê phổ biến:
| Hàm |
Mô tả |
sum |
Tính tổng các phần tử. |
mean |
Tính trung bình cộng. |
std, var |
Tính độ lệch chuẩn và phương sai. |
min, max |
Tìm giá trị nhỏ nhất và lớn nhất. |
argmin, argmax |
Tìm chỉ số (index) của giá trị nhỏ nhất/lớn nhất. |
cumsum |
Tính tổng tích lũy của các phần tử. |
Thao tác trên mảng Boolean
Các giá trị Boolean sẽ được ép kiểu thành 1 (True) và 0 (False). Do đó, chúng ta có thể dùng hàm
sum() để đếm số lượng giá trị thỏa mãn một điều kiện.
random_vals = np.random.randn(50)
count_positive = (random_vals > 0).sum()
print(f"Số lượng số dương: {count_positive}")
bool_list = np.array([False, True, False])
print(bool_list.any()) # Kết quả True nếu có ít nhất một phần tử True
print(bool_list.all()) # Kết quả True nếu tất cả phần tử là True
Sắp xếp dữ liệu (Sorting)
Mảng NumPy có thể được sắp xếp tại chỗ (in-place) bằng phương thức
sort(). Đối với mảng nhiều chiều, bạn có thể chỉ định trục cần sắp xếp.
unsorted_arr = np.array([[3, 1, 2], [6, 4, 5]])
unsorted_arr.sort(axis=1) # Sắp xếp tăng dần theo từng hàng
print(unsorted_arr)
# [[1 2 3]
# [4 5 6]]
Các phép toán tập hợp trên mảng một chiều
NumPy hỗ trợ các phép toán logic tập hợp cơ bản như tìm giá trị duy nhất hoặc kiểm tra sự tồn tại của phần tử.
tags = np.array(['python', 'data', 'numpy', 'python', 'data'])
unique_tags = np.unique(tags)
print(unique_tags)
# ['data' 'numpy' 'python']
check_membership = np.in1d(tags, ['python', 'c++'])
print(check_membership)
# [ True False False True False]
Bảng tổng hợp các phép toán tập hợp:
| Hàm |
Mô tả |
unique(x) |
Trả về các phần tử duy nhất trong x đã được sắp xếp. |
intersect1d(x, y) |
Tìm các phần tử chung của x và y. |
union1d(x, y) |
Tìm hợp của hai tập hợp x và y. |
setdiff1d(x, y) |
Tìm các phần tử có trong x nhưng không có trong y. |