Let's Learn Numpy

Numpy là gì?

Numpy là một package chủ yếu cho việc tính toán khoa học trên Python. Vì Numpy hỗ trợ mạnh mẽ việc tính toán với matrix, vector và các các hàm đại số tuyến tính cơ bản nên nó được sử dụng nhiều trong việc implement các thuật toán Machine Learning.

Khởi tạo vector và matrix

Row vector (1xn vector)

import numpy as np
>>> x = np.array([1, 2, 3])
>>> x
array([1, 2, 3])

Matrix

>>> x = np.array([[1, 3], [4, 4], [4, 2]])
>>> x
array([[1, 3], [4, 4], [4, 2]])
// 3x2 matrix 

Zeros matrix

>>> np.zeros((2, 1))
array([[0],  [0]])

Normal random matrix N(0, 1)

np.random.randn(row, column)

shape và reshape

shape trả về kích thước của matrix

>>> x = np.array([[1, 3], [4, 4], [4, 2]])
>>> x.shape
(3, 2)

reshape biến đổi matrix thành một matrix có kích thước khác.

>>> x = np.array([[1, 3], [4, 4], [4, 2]])
>>> x = x.reshape(2, 3) //reshape thành 2x3 matrix
>>> x
array([[1, 3, 4],  [4, 4, 2]])

>>> x = np.array([[1, 3], [4, 4], [4, 2]])
>>> x = x.reshape(2, -1) //nếu chiều là -1 thì sẽ tự tính dựa vào các chiều còn lại
>>> x
array([[1, 3, 4],  [4, 4, 2]])

Matrix transpose

>>> x = np.array([[1, 3], [4, 4], [4, 2]])
>>> x.T
array([[1, 4, 4], [3, 4, 2]])

Tổng các row, column của matrix

Tổng của mỗi row

>>> x = np.array([[1, 3], [4, 4], [4, 2]])
>>> np.sum(x, axis = 1, keepdims = True)
array([[4], [8], [6]])

Tổng của mỗi column

>>> x = np.array([[1, 3], [4, 4], [4, 2]])
>>> np.sum(x, axis = 0, keepdims = True)
array([[9, 9]])

Norm của các row, column của matrix

norm của một vector là chiều dài của vector đó norm của mỗi row

>>> x = np.array([[0, 3], [4, 3], [6, 8]])
>>> np.linalg.norm(x, axis = 1, keepdims = True)
array([[3], [5], [10]])

norm của mỗi column

>>> x = np.array([[0, 6], [4, 0], [3, 8]])
>>> np.linalg.norm(x, axis = 0, keepdims = True)
array([[5,  10]])

Elementwise operation (các phép toán tác động tới từng phần tử của matrix)

>>> x = np.array([1, 2, 3])
>>> np.log(x) // log cơ số e mỗi phần tử
array([ 0,  0.69314718,  1.09861229])

>>> np.abs(x)
array([1, 2, 3])

>>> np.maximum(x, 2) //so sánh mỗi phần tử với 2 và lấy max
array([2, 2, 3])

>>> np.minimum(x, 2)
array([1, 2, 2])

>>> x**2
array([1, 4, 9])

Elementwise multiply 2 matrix (nhân các phần tử tương ứng 2 matrix với nhau)

>>> x = np.array([[1, 2, 3], [1, 3, 4]])
>>> y = np.array([[0, 3, 1], [4, 1, 1]])
>>> x * y
array([[0, 6, 3], [4, 3, 4]])

// or
>>> np.multiply(x, y)
array([[0, 6, 3], [4, 3, 4]])

Dot product 2 vector

>>> x = np.array([1, 2, 3])
>>> y = np.array([0, 3, 1])
>>> np.dot(x, y)
9

Nhân matrix

>>> x = np.array([[1, 2], [1, 0]])
>>> y = np.array([[0, 3, 1], [1, 3, 0]])
>>> np.dot(x, y)
array([[2, 9, 1], [0, 3, 1]])

Broadcasting

Khi +, -, , / matrix với vector thì python sẽ tự động biến đổi vector thành một matrix cùng kích thước với matrix kia, đó gọi là broadcasting. Tổng quát (m, n) + - * / (1, n) -> (m, n) (m, 1) -> (m, n)

>>> x = np.array([1, 2, 4])
>>> x + 1 // tự động broadcast 1 thành np.array([1, 1, 1])
array([2, 3, 5])

>>> x = np.array([[1, 2, 4], [4, 2, 1]])
>>> x + np.array([0, 1, 4]) // tự động broadcast np.array([0, 1, 4]) thành np.array([[0, 1, 4], [0, 1, 4]]) 
array([[1, 3, 8],  [4, 3, 5]])

>>> x = np.array([[1, 2, 4], [4, 2, 1]])
>>> x + np.array([[0], [1]]) //tự động broadcast np.array([[0], [1]]) thành np.array([[0, 0, 0], [1, 1, 1]])
array([[1, 2, 4], [5, 3, 2]])

Kết luận

Trên đây tôi đã giới thiệu các kỹ thuật làm việc với matrix và vector trong numpy. Mong rằng từ các kỹ thuật này các bạn có thể tự mình xây dựng được các thuật toán hữu ích hay có thể tìm hiểu sâu hơn về thư viện cho tính toán khoa học rất mạnh này.