Xử lý dữ liệu hiệu quả bằng Vectorization với thư viện NumPy

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.

Thẻ: numpy python data-analysis Vectorization ndarray

Đăng vào ngày 7 tháng 8 lúc 18:22