Skip to Content
Python📦 Thư viện NumpyHướng dẫn nhanh (Quickstart)

Hướng dẫn nhanh (Quickstart)

Những điều cơ bản

Đối tượng chính của NumPy là mảng đa chiều đồng nhất. Đây là một bảng các phần tử (thường là số), tất cả thuộc cùng một kiểu, được lập chỉ mục bởi một tuple gồm các số nguyên không âm. Trong NumPy, các chiều được gọi là trục (axes).

Ví dụ, mảng tọa độ của một điểm trong không gian 3D, [1, 2, 1], có một trục. Trục đó có 3 phần tử, nên ta nói nó có độ dài là 3. Trong ví dụ hình bên dưới, mảng có 2 trục. Trục đầu tiên có độ dài là 2, trục thứ hai có độ dài là 3.

[[1., 0., 0.], [0., 1., 2.]]

Lớp mảng của NumPy được gọi là ndarray. Các thuộc tính quan trọng hơn của đối tượng ndarray là:

  • ndarray.ndim: số trục (chiều) của mảng.
  • ndarray.shape: kích thước của mảng. Đây là một tuple gồm các số nguyên cho biết kích thước của mảng trong mỗi chiều.
  • ndarray.size: tổng số phần tử của mảng.
  • ndarray.dtype: một đối tượng mô tả kiểu của các phần tử trong mảng.
  • ndarray.itemsize: kích thước tính bằng byte của mỗi phần tử trong mảng.
  • ndarray.data: bộ đệm chứa các phần tử thực tế của mảng.

Một ví dụ

import numpy as np a = np.arange(15).reshape(3, 5) print(a) # array([[ 0, 1, 2, 3, 4], # [ 5, 6, 7, 8, 9], # [10, 11, 12, 13, 14]]) print(a.shape) # (3, 5) print(a.ndim) # 2 print(a.dtype.name) # 'int64' print(a.itemsize) # 8 print(a.size) # 15 print(type(a)) # <class 'numpy.ndarray'>

Khởi tạo mảng

Có một vài cách để tạo mảng. Ví dụ, bạn có thể tạo một mảng từ một danh sách hoặc tuple Python thông thường bằng hàm array.

import numpy as np a = np.array([2, 3, 4]) print(a) # array([2, 3, 4])

Thường thì các phần tử của một mảng ban đầu chưa được xác định, nhưng kích thước của nó đã biết. Do đó, NumPy cung cấp một số hàm để tạo mảng với nội dung giữ chỗ ban đầu:

  • zeros: tạo một mảng chứa toàn số 0
  • ones: tạo một mảng chứa toàn số 1
  • empty: tạo một mảng có nội dung ban đầu là ngẫu nhiên và phụ thuộc vào trạng thái của bộ nhớ
np.zeros((3, 4)) np.ones((2, 3, 4), dtype=np.int16) np.empty((2, 3))

Để tạo các chuỗi số, NumPy cung cấp hàm arange tương tự như hàm range tích hợp của Python, nhưng trả về một mảng.

np.arange(10, 30, 5) # array([10, 15, 20, 25])

Các thao tác cơ bản

Các toán tử số học trên mảng được áp dụng trên từng phần tử (elementwise). Một mảng mới được tạo ra và lấp đầy bằng kết quả.

a = np.array([20, 30, 40, 50]) b = np.arange(4) c = a - b # array([20, 29, 38, 47]) b**2 # array([0, 1, 4, 9]) 10 * np.sin(a) a < 35

Không giống như trong nhiều ngôn ngữ ma trận, toán tử tích * hoạt động trên từng phần tử trong mảng NumPy. Tích ma trận có thể được thực hiện bằng toán tử @ hoặc hàm/phương thức dot.

A = np.array([[1, 1], [0, 1]]) B = np.array([[2, 0], [3, 4]]) A * B # tích từng phần tử A @ B # tích ma trận A.dot(B) # một cách khác để tính tích ma trận

Các hàm phổ quát (Universal functions)

NumPy cung cấp các hàm toán học quen thuộc như sin, cos và exp. Trong NumPy, chúng được gọi là các “hàm phổ quát” (ufunc). Trong NumPy, các hàm này hoạt động trên từng phần tử của mảng, tạo ra một mảng ở đầu ra.

B = np.arange(3) np.exp(B) np.sqrt(B)

Thao tác hình dạng (Shape Manipulation)

Thay đổi hình dạng của mảng

Một mảng có hình dạng được cho bởi số lượng phần tử dọc theo mỗi trục. Hình dạng của mảng có thể được thay đổi bằng các lệnh khác nhau.

a = np.floor(10 * np.random.random((3, 4))) a.ravel() # trả về mảng đã được làm phẳng a.reshape(6, 2) # trả về mảng với hình dạng đã thay đổi a.T # trả về mảng đã chuyển vị

Hàm reshape trả về đối số của nó với hình dạng đã thay đổi, trong khi phương thức ndarray.resize sửa đổi chính mảng đó.

Xếp chồng các mảng khác nhau

Một số mảng có thể được xếp chồng lên nhau dọc theo các trục khác nhau:

a = np.floor(10 * np.random.random((2, 2))) b = np.floor(10 * np.random.random((2, 2))) np.vstack((a, b)) # xếp chồng theo chiều dọc np.hstack((a, b)) # xếp chồng theo chiều ngang

Bản sao và Chế độ xem (Copies and Views)

Không sao chép

Các lệnh gán đơn giản không tạo ra bản sao của các đối tượng hoặc dữ liệu của chúng.

a = np.arange(12) b = a # không có đối tượng mới nào được tạo ra b is a # a và b là hai tên gọi cho cùng một đối tượng ndarray # True

Chế độ xem hoặc Bản sao nông (View or shallow copy)

Các đối tượng mảng khác nhau có thể chia sẻ cùng một dữ liệu. Phương thức view tạo ra một đối tượng mảng mới xem cùng một dữ liệu.

c = a.view() c is a # False c.base is a # True c[0, 4] = 1234 # dữ liệu của a cũng bị thay đổi

Bản sao sâu (Deep copy)

Phương thức copy tạo ra một bản sao hoàn chỉnh của mảng và dữ liệu của nó.

d = a.copy() d is a # False d.base is a # False

Quy tắc lan truyền (Broadcasting rules)

Cơ chế lan truyền cho phép các hàm phổ quát xử lý các đầu vào không có hình dạng hoàn toàn giống nhau một cách có ý nghĩa.

Quy tắc đầu tiên của lan truyền là nếu tất cả các mảng đầu vào không có cùng số chiều, một số “1” sẽ được thêm lặp lại vào trước hình dạng của các mảng nhỏ hơn cho đến khi tất cả các mảng có cùng số chiều.

Quy tắc thứ hai của lan truyền đảm bảo rằng các mảng có kích thước bằng 1 dọc theo một chiều nhất định sẽ hoạt động như thể chúng có kích thước của mảng có hình dạng lớn nhất dọc theo chiều đó. Giá trị của phần tử mảng được giả định là giống nhau dọc theo chiều đó đối với mảng “lan truyền”.

Sau khi áp dụng các quy tắc lan truyền, kích thước của tất cả các mảng phải khớp nhau.

Last updated on