Cheat sheet NumPy
Cập nhật lần cuối
Tạo mảng
Một mảng chứa các giá trị cùng kiểu, sắp thành lưới với số chiều bất kỳ.
| Việc cần làm | Code |
|---|---|
| Import thư viện NumPy | import numpy as np |
| Từ một list | np.array([1, 2, 3]) |
| Mảng 2 chiều từ list lồng nhau | np.array([[1, 2, 3], [4, 5, 6]]) |
| Toàn số 0, toàn số 1, cùng một giá trị | np.zeros((2, 3)), np.ones(4), np.full((2, 2), 7) |
| Dãy số có bước nhảy (không gồm điểm cuối) | np.arange(0, 10, 2) # [0 2 4 6 8] |
| n điểm cách đều (gồm cả điểm cuối) | np.linspace(0, 1, 5) # [0. 0.25 0.5 0.75 1.] |
| Ma trận đơn vị | np.eye(3) |
| Cùng hình dạng với một mảng khác | np.zeros_like(m), np.ones_like(m) |
| Chọn kiểu phần tử | np.array([1, 2, 3], dtype=np.float32) |
| Lưới tọa độ | xx, yy = np.meshgrid(np.arange(3), np.arange(2)) |
Xem thông tin mảng
| Việc cần làm | Code |
|---|---|
| Shape: kích thước của từng chiều | m.shape # (3, 4) |
| Số chiều | m.ndim # 2 |
| Số phần tử | m.size # 12 |
| Kiểu phần tử | m.dtype # int64 |
| Đổi kiểu | m.astype(np.float64) |
| Độ dài của chiều đầu tiên | len(m) # 3 |
| Chuyển lại thành list Python | m.tolist() |
| In ít chữ số thập phân hơn | np.set_printoptions(precision=3, suppress=True) |
Chỉ số và cắt lát
Lát cắt là view: chúng dùng chung bộ nhớ với mảng gốc. Mask và danh sách chỉ số trả về bản sao.
| Việc cần làm | Code |
|---|---|
| Phần tử đầu tiên và cuối cùng | a[0], a[-1] |
| Cắt lát start:stop (không gồm stop) | a[1:4] # [20 30 40] |
| Cách một phần tử lấy một, đảo ngược | a[::2], a[::-1] |
| Một phần tử của mảng 2 chiều | m[1, 2] # 6 |
| Một hàng, một cột | m[0], m[:, 1] |
| Một khối gồm nhiều hàng và cột | m[:2, 1:3] |
| Các phần tử thỏa mãn điều kiện | a[a > 25] # [30 40 50] |
| Kết hợp điều kiện | a[(a > 15) & (a < 45)] |
| Chọn theo danh sách vị trí | a[[0, 2, 4]] |
| Các vị trí thỏa mãn điều kiện | np.flatnonzero(a > 25) # [2 3 4] |
| Chọn giá trị cho từng phần tử | np.where(a > 25, a, 0) |
| Sao chép trước khi sửa một lát cắt | part = a[1:3].copy() |
| Gán giá trị bằng mask | a[a > 40] = 0 |
Phép toán và broadcasting
Toán tử tính trên từng phần tử. Broadcasting kéo giãn một số vô hướng, một hàng hoặc một cột cho khớp với hình dạng của mảng kia.
| Việc cần làm | Code |
|---|---|
| Số học trên từng phần tử | x + y, x - y, x * y, x / y, x ** 2 |
| Với một số vô hướng | x * 10 |
| Căn bậc hai, hàm mũ, logarit | np.sqrt(x), np.exp(x), np.log(x) |
| Giá trị tuyệt đối, làm tròn | np.abs(x - 5), np.round(x / 3, 2) |
| Giới hạn giá trị trong một khoảng | np.clip(x, 2, 8) |
| Giá trị lớn nhất theo từng phần tử | np.maximum(x, 3) |
| Tích vô hướng | x @ y # 37.0 |
| Chuẩn hóa tâm từng cột (broadcast một hàng) | m - m.mean(axis=0) |
| Chia tỷ lệ từng hàng (broadcast một cột) | m / m.sum(axis=1, keepdims=True) |
| So sánh số thực an toàn | np.isclose(0.1 + 0.2, 0.3) # True, np.allclose(x, y) |
| Lượng giác và số pi | np.sin(np.pi / 2) # 1.0 |
Tổng hợp theo một axis
axis=0 tính dọc theo các hàng và cho một kết quả mỗi cột. axis=1 tính ngang qua các cột và cho một kết quả mỗi hàng.
| Việc cần làm | Code |
|---|---|
| Tổng của mọi phần tử | m.sum() # 21 |
| Một kết quả mỗi cột | m.sum(axis=0) # [5 7 9] |
| Một kết quả mỗi hàng | m.sum(axis=1) # [ 6 15] |
| Trung bình và độ lệch chuẩn | m.mean(), m.std(), m.mean(axis=0) |
| Nhỏ nhất, lớn nhất | m.min(), m.max(axis=1) |
| Vị trí của giá trị lớn nhất | m.argmax(), m.argmax(axis=1) |
| Trung vị và phân vị | np.median(m), np.percentile(m, [25, 50, 75]) |
| Tổng tích lũy | np.cumsum(m, axis=1) |
| Tích của mọi phần tử | m.prod() # 720 |
| Có phần tử nào, tất cả, đếm | (m > 4).any(), (m > 0).all(), np.count_nonzero(m > 2) |
Đổi hình dạng và ghép mảng
Reshape giữ nguyên các phần tử và chỉ đổi hình dạng, nên tổng số phần tử phải giữ nguyên.
| Việc cần làm | Code |
|---|---|
| Hình dạng mới | a.reshape(2, 3) |
| Để NumPy tự tính một kích thước | a.reshape(3, -1), a.reshape(-1, 1) |
| Làm phẳng thành mảng 1 chiều | m.ravel(), m.flatten() |
| Chuyển vị | m.T |
| Thêm một chiều | a[:, np.newaxis], np.expand_dims(a, axis=0) |
| Bỏ các chiều có kích thước 1 | np.squeeze(np.ones((1, 3, 1))) |
| Nối theo một axis có sẵn | np.concatenate([a, a]) |
| Xếp chồng theo hàng hoặc theo cột | np.vstack([m, m]), np.hstack([m, m]) |
| Mảng 1 chiều thành các cột | np.column_stack([a, a ** 2]) |
| Xếp chồng theo một axis mới | np.stack([a, a], axis=0) # shape (2, 6) |
| Chia thành nhiều phần | np.split(a, 3), np.array_split(a, 4) |
| Lặp lại phần tử hoặc lặp cả mảng | np.repeat([1, 2], 2) # [1 1 2 2], np.tile([1, 2], 2) # [1 2 1 2] |
Sắp xếp, tìm kiếm và giá trị duy nhất
| Việc cần làm | Code |
|---|---|
| Bản sao đã sắp xếp | np.sort(a) |
| Lớn nhất đứng đầu | np.sort(a)[::-1] |
| Các vị trí để sắp xếp | np.argsort(a) |
| Ba giá trị lớn nhất | np.sort(a)[-3:] |
| Giá trị duy nhất và số lần xuất hiện | values, counts = np.unique(a, return_counts=True) |
Tên hàm trong NumPy 2 (unique_values có thể không được sắp xếp) | np.unique_values(a), np.unique_counts(a) |
| Mỗi phần tử có nằm trong một list không? | np.isin(a, [1, 9]) |
| Vị trí chèn vào một mảng đã sắp xếp | np.searchsorted([1, 3, 5, 7], 4) # 2 |
| Phép toán tập hợp | np.intersect1d(a, [1, 2, 10]), np.union1d(a, [10]), np.setdiff1d(a, [1]) |
| Sắp xếp các hàng theo một cột | m[m[:, 1].argsort()] |
Số ngẫu nhiên
Tạo một Generator có seed và lấy mọi số ngẫu nhiên từ nó, để kết quả giống nhau qua mỗi lần chạy.
| Việc cần làm | Code |
|---|---|
| Generator có seed | rng = np.random.default_rng(42) |
| Số thực trong [0, 1) | rng.random(3) |
| Số nguyên, không gồm cận trên | rng.integers(1, 7, size=10) |
| Phân phối chuẩn | rng.normal(loc=0, scale=1, size=(2, 3)) |
| Số thực phân phối đều trong một khoảng | rng.uniform(5, 10, size=4) |
| Chọn từ một list | rng.choice(["a", "b", "c"], size=5) |
| Chọn không lặp lại | rng.choice(10, size=3, replace=False) |
| Chọn theo trọng số | rng.choice(["H", "T"], size=10, p=[0.7, 0.3]) |
| Bản sao đã xáo trộn, xáo trộn tại chỗ | rng.permutation(a), rng.shuffle(a) |
| Số đếm theo phân phối nhị thức và Poisson | rng.binomial(10, 0.5, size=5), rng.poisson(3, size=5) |
Đại số tuyến tính
| Việc cần làm | Code |
|---|---|
| Tích ma trận | A @ A |
| Giải Ax = b | np.linalg.solve(A, b) # [0.8 1.4] |
| Ma trận nghịch đảo và định thức | np.linalg.inv(A), np.linalg.det(A) |
| Độ dài vector | np.linalg.norm(b) |
| Trị riêng và vector riêng | values, vectors = np.linalg.eig(A) |
| Khớp một đường thẳng | slope, intercept = np.polyfit(x, y, 1) |
| Tích ngoài | np.outer([1, 2], [3, 4]) |
| Đường chéo và vết | np.diag(A), np.trace(A) |
Giá trị thiếu và giá trị đặc biệt
np.nan đánh dấu một số thực bị thiếu. Mọi phép toán với nó đều cho nan, nên hãy dùng các hàm nan hoặc một mask.
| Việc cần làm | Code |
|---|---|
| Giá trị thiếu | np.nan |
| Tìm giá trị thiếu | np.isnan(v), np.isnan(v).sum() |
| Bỏ giá trị thiếu | v[~np.isnan(v)] |
| Thay giá trị thiếu và giá trị vô cùng | np.nan_to_num(v, nan=0.0, posinf=0.0) |
| Vô cùng và kiểm tra giá trị hữu hạn | np.inf, np.isfinite(v) |
| Thống kê bỏ qua NaN | np.nanmean(v[:3]) # 2.0, np.nanmax(v) |
Lưu và tải
| Việc cần làm | Code |
|---|---|
| Một mảng, tệp nhị phân | np.save("data.npy", m), m = np.load("data.npy") |
| Nhiều mảng trong một tệp | np.savez("data.npz", x=x, y=y), np.load("data.npz")["x"] |
| Ghi ra tệp CSV | np.savetxt("data.csv", m, delimiter=",", fmt="%d") |
| Đọc tệp CSV | np.loadtxt("data.csv", delimiter=",") |
NumPy 2: tên cũ và cách viết hiện nay
NumPy 2 đã xóa nhiều bí danh, nên code sao chép từ các hướng dẫn cũ có thể báo lỗi AttributeError.
| Việc cần làm | NumPy 2 | Cách viết cũ |
|---|---|---|
| Giá trị thiếu | np.nan | np.NaN |
| Vô cùng | np.inf | np.Inf |
| Kiểu số thực 64 bit | np.float64 | np.float_ |
| Diện tích dưới đường cong | np.trapezoid(y, x) | np.trapz(y, x) |
| Mỗi phần tử có nằm trong mảng khác không? | np.isin(a, b) | np.in1d(a, b) |
| Xếp chồng các hàng | np.vstack([a, a]) | np.row_stack([a, a]) |
| Tích | np.prod(a) | np.product(a) |
| Số ngẫu nhiên | rng = np.random.default_rng(0)
rng.random(3) | np.random.seed(0)
np.random.rand(3) |
Những lệnh NumPy làm nền cho code khoa học dữ liệu, chia theo từng việc: tạo mảng, xem thông tin mảng, truy cập theo chỉ số và cắt lát, tính toán từng phần tử, tổng hợp theo một axis, đổi hình dạng và ghép mảng, sắp xếp và tìm kiếm, tạo số ngẫu nhiên và giải bài toán đại số tuyến tính. Mỗi dòng là một đoạn code ngắn bạn có thể dán vào, kèm một câu giải thích nó làm gì.
Mọi thứ ở đây viết cho NumPy 2, phiên bản Coddy đang chạy, và bảng cuối cùng liệt kê các tên mà NumPy 2 đã xóa, cạnh cách viết nên dùng thay thế. Phần lớn ví dụ dùng a = np.array([3, 1, 4, 1, 5, 9, 2, 6]) và m = np.arange(12).reshape(3, 4). Bạn mới bắt đầu với Python? Hãy xem cheat sheet Python và playground Python trước, và mở các cheat sheet pandas, Matplotlib và scikit-learn bên cạnh trang này.
Câu hỏi thường gặp về cheat sheet NumPy
Cheat sheet NumPy này có miễn phí không?
Có. Cheat sheet NumPy này hoàn toàn miễn phí, không cần đăng ký. Lưu trang lại hoặc in ra PDF từ trình duyệt, rồi quay lại bất cứ khi nào bạn cần đúng lệnh để reshape, tính tổng theo axis hay lấy số ngẫu nhiên.
Cheat sheet này dành cho phiên bản NumPy nào?
np.NaN, np.float_, np.trapz và np.in1d, nên bảng cuối cùng đặt từng tên đó cạnh tên hiện tại.axis=0 trong NumPy nghĩa là gì?
axis=0 chạy dọc theo các hàng, nên m.sum(axis=0) trả về một tổng cho mỗi cột. axis=1 chạy ngang qua các cột và trả về một tổng cho mỗi hàng. Nếu không có axis, hàm dùng mọi phần tử.View và bản sao khác nhau thế nào?
a[1:3] là view: nó dùng chung bộ nhớ với a, nên sửa lát cắt sẽ làm a thay đổi theo. Mask boolean và danh sách chỉ số như a[a > 2] hay a[[0, 2]] trả về bản sao. Gọi .copy() khi bạn cần một mảng độc lập.Vì sao dùng mảng NumPy thay vì list Python?
a * 2 nhân đôi mọi phần tử, còn [1, 2] * 2 lặp lại list. pandas và scikit-learn đều xây dựng trên mảng NumPy.Nên dùng np.random.seed hay default_rng?
rng = np.random.default_rng(seed) và gọi phương thức trên rng, như rng.normal() hay rng.integers(). Đây là API được khuyến nghị, cho luồng số ngẫu nhiên tốt hơn và không có trạng thái toàn cục ẩn. np.random.seed và np.random.rand vẫn dùng được nhưng là giao diện cũ.