Skip to content

Numpy

What is Numpy?

Numpy là một thư viện Python cho phép bạn thực hiện các phép tính số. Cốt lõi của Numpy là một kiểu dữ liệu cơ bản được gọi là mảng Numpy.

Trong Python, Numpy là một trong những thư viện quan trọng nhất cho khoa học dữ liệu và học máy.

Trong tâm của Numpy là làm việc với dữ liệu số. Nó vừa mạnh mẽ vừa ở mức cơ bản, do đó cung cấp các chức năng cơ bản cho các thuật toán cấp cao. Nếu muốn bước vào lĩnh vực học máy và khoa học dữ liệu trước tiên phải thành thạo Numpy.

Type Description Bytes
bool boolean 1
int int 4 or 8
float float 8
complex complex 16
np.int8 Integer 1
np.int16 Integer 2
np.int32 Integer 4
np.int64 Integer 8
np.float16 Float 2
np.float32 Float 4
np.float64 Float 8

Sau đây là một ví dụ cách tạo các mảng numpy với nhiều kiểu dữ liệu khác nhau.

Ví dụ chạy với numpy phiên bản 2.0.2

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import numpy as np

print(np.__version__)

a = np.array([1, 2, 3], dtype=np.int16)
print(a)
print(a.dtype)

b = np.array([1, 2, 3], dtype=np.float64)
print(b)
print(b.dtype)

Trong ví dụ trên ta tạo hai mảng numpy. Mảng đầu tiên có kiểu dữ liệu np.int16. Mảng thứ hai có kiểu dữ liệu np.float64.

np? để hiện thị tài liệu hướng dẫn. np.<TAB> để hiện thị các nội dung.

Tạo mảng

Ta sẽ tạo 3 mảng giá trị ngẫu nhiên: mảng 1 chiều, mảng 2 chiều, mảng 3 chiều.

seed là trình tạo số ngẫu nhiên của numpy, với một giá trị khởi tạo cố định để đảm bảo các mảng ngẫu nhiên được tạo ra giống nhau mỗi khi đoạn mã này được chạy.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
np.random.seed(0)

x1 = np.random.randint(10, size=6)          # 1D
x2 = np.random.randint(10, size=(3, 4))     # 2D
x3 = np.random.randint(10, size=(3, 4, 5))  # 3D

print("x3 ndim: ", x3.ndim)
print("x3 shape: ", x3.shape)
print("x3 size: ", x3.size)
print("x3 dtype: ", x3.dtype)

print("itemsize:", x3.itemsize, "bytes")
print("nbytes:", x3.nbytes, "bytes")
  • ndim: cho biết số chiều của mảng.
  • shape: cho biết hình dạng của mảng.
  • size: cho biết mảng có bao nhiêu phần tử.
  • dtype: cho biết kiểu dữ liệu phần tử trong mảng.
  • itemsize: liệt kê kích thước (tính bằng byte).
  • nbytes: liệt kê tổng kích thước của mảng (byte).

Array Indexing

x[start:stop:step]

1
2
3
4
5
print(x1)
print(x1[0])
print(x1[-1])
print(x1[-2])
print(x1[::2]) # lấy từ đầu đến cuối mảng mỗi là lấy bỏ qua 2 phần tử

Reshaping of Arrays

Dùng thuộc tính reshape để thay đổi hình dạng của 1 mảng numpy. Trong ví dụ sau ta tạo 1 mảng 1 chiều có 9 phần tử. Sau đó dùng reshape chuyển thành mảng 2 chiều 3x3.

1
2
grid = np.arange(1, 10).reshape((3, 3))
print(grid)

Hoặc có thể dùng từ khóa newaxis

1
2
3
4
5
6
7
x = np.array([1, 2, 3])

x.reshape((1, 3))  # row vector via newaxis
x[np.newaxis, :]

x.reshape((3, 1))  # column vector via reshape
x[:, np.newaxis]

Array Concatenation and Splitting

Tất cả các hàm trước đều hoạt động trên mảng đơn lẻ. Ta có thể kết hợp nhiều mảng thành một và ngược lại chia một mảng thành nhiều mảng.

Concatenation of arrays: np.concatenate, np.vstack, np.hstack, np.concatenate

1
2
3
x = np.array([1, 2, 3])
y = np.array([3, 2, 1])
np.concatenate([x, y])
  • vstack: thêm theo chiều dọc (mở rộng theo dòng)
  • hstack: thêm theo chiều ngang (mở rộng theo cột)

Splitting of arrays: np.vsplit, np.hsplit

  • vsplit: chia theo chiều dọc (theo dòng)
  • hsplit: chia theo chiều ngang (theo cột)
  • split:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    x = [1, 2, 3, 99, 99, 3, 2, 1]
    x1, x2, x3 = np.split(x, [3, 5])
    print(x1, x2, x3)
    
    grid = np.arange(16).reshape((4, 4))
    upper, lower = np.vsplit(grid, [2]) #[2] tham số này cho biết mảng muốn chia có 2 dòng
    print(upper)
    print(lower)
    
    left, right = np.hsplit(grid, [2])
    print(left)
    print(right)
    

thường ta sẽ gặp từ khóa axis=0, axis=1. 0 tương ứng với dòng, 1 tương ứng với cột.

Tổng kết

Ta đã tìm hiểu những khái niệm hết sức cơ bản numpynhư:

  • Tạo mảng.
  • Kiểu dữ liệu phần tử của mảng.
  • Kích thước, hình dạng, thay đổi hình dạng.
  • Gộp mảng, chia tách mảng.