NumPy là thư viện nền tảng cho tính toán số trong Python, cung cấp cấu trúc mảng đa chiều hiệu năng cao (ndarray) cùng hàng loạt hàm toán học tối ưu. Dưới đây là tổng quan thực hành về các khái niệm cốt lõi.
Tạo mảng đa chiều
import numpy as np
# Khởi tạo từ danh sách
matrix_a = np.array([[1, 2], [3, 4], [5, 6]]) # mảng 3x2
# Các hàm tiện ích
zeros_3d = np.zeros((2, 3, 4)) # mảng 3 chiều toàn 0
ones_like_a = np.ones_like(matrix_a) # giống shape matrix_a, toàn 1
identity_mat = np.eye(4) # ma trận đơn vị 4x4
sequence = np.arange(5, 15, 2) # [5, 7, 9, 11, 13]
Thuộc tính cơ bản của ndarray
ndim: số chiều (ví dụ: mảng 2D →ndim == 2)shape: tuple biểu diễn kích thước mỗi trục (vd:(3, 4))size: tổng số phần tử (shape[0] * shape[1] * ...)dtype: kiểu dữ liệu nội bộ (ví dụ:np.float32,np.int64)nbytes: tổng bộ nhớ (byte) mà mảng chiếm dụng
Chuyển đổi kiểu dữ liệu
data_int = np.array([1, 2, 3])
data_float = data_int.astype(np.float64) # hoặc 'float64'
data_str = data_int.astype('U10') # chuỗi Unicode độ dài tối đa 10 ký tự
Thay đổi cấu trúc mảng
Các thao tác sau đều trả về mảng mới — không ảnh hưởng đến mảng gốc:
grid = np.arange(12).reshape(3, 4)
flattened = grid.ravel() # thành vector 1D (tham chiếu nếu có thể)
reshaped = grid.reshape(-1, 2) # tự động suy ra chiều đầu: (6, 2)
transposed = grid.T # chuyển vị: (4, 3)
# Với mảng 3D
cube = np.arange(24).reshape(2, 3, 4)
swapped = cube.swapaxes(0, 2) # hoán đổi trục thứ nhất và thứ ba → (4, 3, 2)
Ghép nối và phân chia mảng
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
# Ghép theo trục hàng (axis=0)
stacked_v = np.vstack([a, b]) # hoặc np.concatenate([a, b], axis=0)
# Ghép theo trục cột (axis=1)
stacked_h = np.hstack([a, b]) # hoặc np.concatenate([a, b], axis=1)
# Chia mảng thành 3 phần dọc theo trục 0
parts = np.split(a, 2, axis=0)
Phát sinh dữ liệu ngẫu nhiên
# Giá trị nguyên ngẫu nhiên trong khoảng [10, 50)
samples_int = np.random.randint(10, 50, size=(3, 4))
# Số thực chuẩn hóa (μ=0, σ=1)
normal_samples = np.random.randn(2, 5)
# Phân phối chuẩn tùy chỉnh (μ=100, σ=15)
iq_scores = np.random.normal(100, 15, size=1000)
# Thiết lập hạt giống để tái tạo kết quả
np.random.seed(42)
shuffled_copy = np.random.permutation([1, 2, 3, 4, 5])
Truy cập và lọc phần tử
- Chỉ mục hỗ trợ cả dạng
arr[i, j]vàarr[i][j] - Cắt lát đa chiều:
grid[1:, :2]→ hàng từ 1 trở đi, 2 cột đầu - Lọc bằng mặt nạ boolean:
mask = grid > 5
filtered = grid[mask] - Chỉ mục nâng cao (fancy indexing):
rows = [0, 2]; cols = [1, 3]
subgrid = grid[np.ix_(rows, cols)]
Phép toán trên mảng
Toán tử vô hướng và mảng:
x = np.array([10, 20, 30])
y = x * 2 + 5 # [25, 45, 65]
z = np.sqrt(x) # [3.16..., 4.47..., 5.47...]
Hàm toán học phổ quát (ufuncs):
np.maximum(a, b): so sánh từng phần tửnp.modf(arr): trả về tuple (phần_thập_phân,phần_nguyên)np.where(condition, x, y): chọn phần tử từxhoặcydựa trên điều kiện
Tổng hợp thống kê
data = np.array([[1, 2, 3], [4, 5, 6]])
data.sum(axis=0) # tổng theo cột → [5, 7, 9]
data.mean(axis=1) # trung bình theo hàng → [2.0, 5.0]
data.std(ddof=1) # độ lệch chuẩn mẫu
data.argmax() # chỉ mục phần tử lớn nhất toàn cục
Xử lý tập hợp
np.unique(arr): loại bỏ trùng lặp và sắp xếp tăng dầnnp.isin(arr, [2, 4]): trả về mảng boolean xác định phần tử có trong danh sách hay khôngnp.intersect1d(a, b): phần tử chung giữa hai mảng 1Dnp.setdiff1d(a, b): phần tử có tronganhưng không trongb
Đại số tuyến tính cơ bản
A = np.array([[1, 2], [3, 4]])
B = np.array([[5], [6]])
# Nhân ma trận
result = A @ B # hoặc np.dot(A, B)
# Định thức và nghịch đảo
det_A = np.linalg.det(A)
inv_A = np.linalg.inv(A)
Nhập/xuất dữ liệu
# Đọc từ file CSV với dấu phẩy làm phân cách
dataset = np.loadtxt("data.csv", delimiter=",", skiprows=1, dtype=float)
# Ghi mảng ra file văn bản
np.savetxt("output.txt", dataset, fmt="%.3f", delimiter="\t")