Menu
CoddyTech

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àmCode
Import thư viện NumPyimport numpy as np
Từ một listnp.array([1, 2, 3])
Mảng 2 chiều từ list lồng nhaunp.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ácnp.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àmCode
Shape: kích thước của từng chiềum.shape # (3, 4)
Số chiềum.ndim # 2
Số phần tửm.size # 12
Kiểu phần tửm.dtype # int64
Đổi kiểum.astype(np.float64)
Độ dài của chiều đầu tiênlen(m) # 3
Chuyển lại thành list Pythonm.tolist()
In ít chữ số thập phân hơnnp.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àmCode
Phần tử đầu tiên và cuối cùnga[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ượca[::2], a[::-1]
Một phần tử của mảng 2 chiềum[1, 2] # 6
Một hàng, một cộtm[0], m[:, 1]
Một khối gồm nhiều hàng và cộtm[:2, 1:3]
Các phần tử thỏa mãn điều kiệna[a > 25] # [30 40 50]
Kết hợp điều kiệna[(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ệnnp.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ắtpart = a[1:3].copy()
Gán giá trị bằng maska[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àmCode
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ướngx * 10
Căn bậc hai, hàm mũ, logaritnp.sqrt(x), np.exp(x), np.log(x)
Giá trị tuyệt đối, làm trònnp.abs(x - 5), np.round(x / 3, 2)
Giới hạn giá trị trong một khoảngnp.clip(x, 2, 8)
Giá trị lớn nhất theo từng phần tửnp.maximum(x, 3)
Tích vô hướngx @ 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ànnp.isclose(0.1 + 0.2, 0.3) # True, np.allclose(x, y)
Lượng giác và số pinp.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àmCode
Tổng của mọi phần tửm.sum() # 21
Một kết quả mỗi cộtm.sum(axis=0) # [5 7 9]
Một kết quả mỗi hàngm.sum(axis=1) # [ 6 15]
Trung bình và độ lệch chuẩnm.mean(), m.std(), m.mean(axis=0)
Nhỏ nhất, lớn nhấtm.min(), m.max(axis=1)
Vị trí của giá trị lớn nhấtm.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ũynp.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àmCode
Hình dạng mớia.reshape(2, 3)
Để NumPy tự tính một kích thướca.reshape(3, -1), a.reshape(-1, 1)
Làm phẳng thành mảng 1 chiềum.ravel(), m.flatten()
Chuyển vịm.T
Thêm một chiềua[:, np.newaxis], np.expand_dims(a, axis=0)
Bỏ các chiều có kích thước 1np.squeeze(np.ones((1, 3, 1)))
Nối theo một axis có sẵnnp.concatenate([a, a])
Xếp chồng theo hàng hoặc theo cộtnp.vstack([m, m]), np.hstack([m, m])
Mảng 1 chiều thành các cộtnp.column_stack([a, a ** 2])
Xếp chồng theo một axis mớinp.stack([a, a], axis=0) # shape (2, 6)
Chia thành nhiều phầnnp.split(a, 3), np.array_split(a, 4)
Lặp lại phần tử hoặc lặp cả mảngnp.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àmCode
Bản sao đã sắp xếpnp.sort(a)
Lớn nhất đứng đầunp.sort(a)[::-1]
Các vị trí để sắp xếpnp.argsort(a)
Ba giá trị lớn nhấtnp.sort(a)[-3:]
Giá trị duy nhất và số lần xuất hiệnvalues, 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ếpnp.searchsorted([1, 3, 5, 7], 4) # 2
Phép toán tập hợpnp.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ộtm[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àmCode
Generator có seedrng = np.random.default_rng(42)
Số thực trong [0, 1)rng.random(3)
Số nguyên, không gồm cận trênrng.integers(1, 7, size=10)
Phân phối chuẩnrng.normal(loc=0, scale=1, size=(2, 3))
Số thực phân phối đều trong một khoảngrng.uniform(5, 10, size=4)
Chọn từ một listrng.choice(["a", "b", "c"], size=5)
Chọn không lặp lạirng.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à Poissonrng.binomial(10, 0.5, size=5), rng.poisson(3, size=5)

Đại số tuyến tính

Việc cần làmCode
Tích ma trậnA @ A
Giải Ax = bnp.linalg.solve(A, b) # [0.8 1.4]
Ma trận nghịch đảo và định thứcnp.linalg.inv(A), np.linalg.det(A)
Độ dài vectornp.linalg.norm(b)
Trị riêng và vector riêngvalues, vectors = np.linalg.eig(A)
Khớp một đường thẳngslope, intercept = np.polyfit(x, y, 1)
Tích ngoàinp.outer([1, 2], [3, 4])
Đường chéo và vếtnp.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àmCode
Giá trị thiếunp.nan
Tìm giá trị thiếunp.isnan(v), np.isnan(v).sum()
Bỏ giá trị thiếuv[~np.isnan(v)]
Thay giá trị thiếu và giá trị vô cùngnp.nan_to_num(v, nan=0.0, posinf=0.0)
Vô cùng và kiểm tra giá trị hữu hạnnp.inf, np.isfinite(v)
Thống kê bỏ qua NaNnp.nanmean(v[:3]) # 2.0, np.nanmax(v)

Lưu và tải

Việc cần làmCode
Một mảng, tệp nhị phânnp.save("data.npy", m), m = np.load("data.npy")
Nhiều mảng trong một tệpnp.savez("data.npz", x=x, y=y), np.load("data.npz")["x"]
Ghi ra tệp CSVnp.savetxt("data.csv", m, delimiter=",", fmt="%d")
Đọc tệp CSVnp.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àmNumPy 2Cách viết cũ
Giá trị thiếunp.nannp.NaN
Vô cùngnp.infnp.Inf
Kiểu số thực 64 bitnp.float64np.float_
Diện tích dưới đường congnp.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àngnp.vstack([a, a])np.row_stack([a, a])
Tíchnp.prod(a)np.product(a)
Số ngẫu nhiênrng = 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?
NumPy 2. Mọi đoạn code đều chạy trên NumPy 2.4, phiên bản Coddy đang chạy. NumPy 2 đã xóa các bí danh như 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 là chiều bị thu gọn lại. Trong mảng 2 chiều, 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?
Lát cắt như 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?
Mảng lưu một kiểu dữ liệu trong một khối bộ nhớ liền nhau, nên phép toán trên cả mảng chạy bằng code đã biên dịch và thường nhanh hơn vòng lặp Python nhiều lần. 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?
Dùng 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ũ.
Có thể chạy code NumPy online không?
Có. Playground Matplotlib miễn phí chạy Python cùng NumPy, pandas, Matplotlib và scikit-learn ngay trên trình duyệt, nên bạn có thể dán bất kỳ đoạn code nào trong cheat sheet này và chạy mà không cần cài đặt gì. Khóa học Machine Learning của Coddy dạy NumPy từng bước trong quá trình làm việc với dữ liệu thật.
Hình minh họa các ngôn ngữ lập trình của Coddy

Học NumPy cùng Coddy

Bắt đầu