You are on page 1of 53

THƯ VIỆN NUMPY &

MACHINE LEARNING

Khoa Công nghệ thông tin


ThS. Nguyễn Thị Lệ Quyên
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Nội dung môn học


• Cơ bản ngôn ngữ lập trình Python
• Numpy và Machine Learning
• Tương tác Cơ sở dữ liệu
• Cơ bản HTML, CSS, JavaScript
• Flask framework
• Kiến thức bổ sung

2
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

NUMPY
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Nội dung
• Mảng đa chiều
• Hàm tiện ích trong NumPy
• Array-Oriented Programming with Arrays
• Xuất nhập File
• Đại số tuyến tính
• Số ngẫu nhiên

4
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Numpy là gì?
• NumPy (Numerical Python), là một thư viện tính toán quan
trọng nhất trong Python.
• NumPy thiết kế đối tương mảng (array objects) cho việc
trao đổi dữ liệu giữa các hàm một cách thuận tiện. Vì vậy
NumPy được sử dụng hầu hết tại các gói (packages) tính
toán trong lĩnh vực khoa học dữ liệu.
• NumPy cung cấp C API nên giúp cho Python trở thành
ngôn ngữ năng động và có khả năng kế thừa được các
thư viện có sẵn như C/C++ hay Fortran

5
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Tính năng quan trọng của NumPy


• Tăng tốc toán tử tính toán với vector như làm sạch dữ liệu, tập con hóa, lọc,
phép biến đổi,…
• Cung cấp các thuật toán phổ biến như sắp xếp, hợp nhất mảng, toán tử tập
hợp (set operations)
• Thống kê và tổng hợp dữ liệu
• Hợp nhất các dữ liệu không đồng nhất
• Biểu diễn logic có điều kiện dưới dạng mảng thay vì sử dụng vòng lặp và lệnh
điều kiện
• Thao tác dữ liệu theo nhóm (tập hợp, biến đổi, hàm ứng dụng)

6
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Tốc độ xử lý của NumPy


• Gấp 10 đến 100 lần so với Python thuần túy.
• Ví dụ:

7
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Vì sao? struct _longobject {


long ob_refcnt;
PyTypeObject *ob_type;
size_t ob_size;
long ob_digit[1];
};

8
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Vì sao?
9
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Mảng có kiểu dữ liệu cố định trong Python


import array

L = list(range(10))
A = array.array('i', L)
print(A)

# array('i', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

10
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

ndarray
• NumPy cho phép thực hiện
các phép toán trên mảng
tương tự như các phép toán
trên số thực

11
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

ndarray trong NumPy


• Kích thước và kiểu dữ liệu của ndarray

12
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Khởi tạo mảng


• Tạo từ Python list
- Sử dụng phương thức array
để chuyển mảng trong
Python qua mảng trong
NumPy

13
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Khởi tạo mảng


• Từ các hàm được xây dựng sẵn
trong NumPy

14
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Khởi tạo mảng


Hàm Mô tả
array Chuyển dữ liệu kiểu list, tuple, array, ... trong Python qua mảng ndarray trong
NumPy
asarray Chuyển input sang ndarray, nhưng không copy nếu input đã là ndarray
arange Giống hàm range nhưng trả về một mảng ndarray thay vì list trong Python
ones, Tạo mảng tất cả các phần tử đều bằng 1 với shape và dtype cho trước;
ones_like ones_like tạo ra một mảng khác có các phần tử đều bằng 1 có kích thước
giống shape và dtype của 1 mảng cho trước
zeros, Giống ones và ones_like nhưng tất cả phần tử đều bằng 0
zeros_like
empty, Tạo một mảng mới bằng cách cấp phát vùng nhớ mới, nhưng giá trị của mảng
empty_like phụ thuộc vào vùng nhớ
full, full_like Tạo 1 mảng với shape và dtype cho trước với tất cả giá trị đểu gán bằng giá trị
chỉ định trước; full_like tạo một mảng khác với kích thước giống share và
dtype của mảng cho trước
eye, identity Tạo 1 ma trận đơn vị NxN (1 trên đường chéo chính và 0 ở những vị trí còn
lại) 15
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Các kiểu dữ liệu chuẩn trong NumPy

16
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Toán tử số học
• NumPy cung cấp các toán tử để thực hiện các phép tính trên mảng mà không
cần sử dụng các lệnh vòng lặp. Người dùng NumPy gọi là vector hóa
(vectorization).

import numpy as np
arr = np.array([[1., 2., 3.], [4., 5., 6.]])
print(arr)
print(arr*arr)
print(arr-arr)
print(1/arr)
print(arr**0.5)
print(arr*arr)

arr2 = np.array([[0., 4., 1.], [7., 2., 12.]])


print(arr>arr2)
17
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Broadcasting

18
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Thao tác trong mảng NumPy


• Thao tác với các phần tử hay các tập con trong mảng của NumPy như thao
tác với list của Python

import numpy as np
arr = np.arange(10)
print(arr)
print(arr[5])
print(arr[5:-1])

[0 1 2 3 4 5 6 7 8 9]
5
[5 6 7 8]

19
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Chỉ mục trong mảng NumPy

20
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Chỉ mục với slice

21
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Chỉ mục Boolean


• Có thể dùng mảng Boolean để tạo mảng con cho 1 mảng khác nếu như có
cùng chiều dài như nhau

import numpy as np ['Bob' 'Joe' 'Will' 'Bob' 'Will' 'Joe' 'Joe']


[[ 0.61351579 -0.72588671 1.52101198 0.70002282]
names = np.array(['Bob', 'Jo [ 0.27705541 0.87402548 -2.05059442 1.41110013]
[ 0.89114229 -0.39914808 1.23431688 -1.32219814]
e', 'Will', 'Bob', 'Will', ' [ 0.51798234 1.63610317 -0.62185666 -0.26285829]

Joe', 'Joe']) [-1.04915382 0.19132779 -0.71809904 -0.40998428]


[ 0.75578892 0.08066942 -1.02714665 -0.08947798]
data = np.random.randn(7, 4) [-0.37626032 0.13307081 -0.2355532 -1.01127001]]
[ True False False True False False False]
print(names) [[ 0.61351579 -0.72588671 1.52101198 0.70002282]
[ 0.51798234 1.63610317 -0.62185666 -0.26285829]]
print(data)
print(names=='Bob')
print(data[names=='Bob'])

22
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Chỉ mục Boolean


• Hãy cho biết kết quả của các lệnh sau:
a)
print(data[names == 'Bob', 2:])

b) print(data[names == 'Bob', 3])

c) data[data < 0] = 0
print(data)

23
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Fancy Indexing
• NumPy cho phép tạo 1 mảng con theo chỉ mục cho trước

import numpy as np
names = np.array([ 'Tuan', 'Phuong', 'Khoi', 'Hieu’,
'Duy', 'Thang', 'Duc'])
print(names)
print(names[[0,5,4]])

['Tuan' 'Phuong' 'Khoi' 'Hieu' 'Duy' 'Thang' 'Duc']


['Tuan' 'Thang' 'Duy']

24
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Fancy Indexing
• Hãy cho biết kết quả đoạn lệnh sau:

arr = np.arange(32).reshape((8, 4))


print(arr[[1, 5, 7, 2], [0, 3, 1, 2]])
print(arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]])

• Hai lệnh print khác nhau chỗ nào?

25
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Ma trận chuyển vị
import numpy as np

arr = np.arange(15).reshape((3, 5))


print(arr)
print(arr.T)

[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]

[[ 0 5 10]
[ 1 6 11]
[ 2 7 12]
[ 3 8 13]
[ 4 9 14]] 26
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Ma trận chuyển vị
• Đối với mảng nhiều chiều, ta cũng có thể chuyển vị mảng như sau:

import numpy as np [[[ 0 1 2 3]


[ 4 5 6 7]]
arr = np.arange(16).reshape((2, 2, 4)) [[ 8 9 10 11]
print(arr) [12 13 14 15]]]
print(arr.transpose((1, 0, 2)))
[[[ 0 1 2 3]
[ 8 9 10 11]]
[[ 4 5 6 7]
[12 13 14 15]]]

27
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Hoán đổi trục ma trận


import numpy as np [[[ 0 1 2 3]
[ 4 5 6 7]]
arr = np.arange(16).reshape((2, 2, 4)) [[ 8 9 10 11]
print(arr) [12 13 14 15]]]
print(arr.swapaxes(1, 2))
[[[ 0 4]
[ 1 5]
[ 2 6]
[ 3 7]]
[[ 8 12]
[ 9 13]
[10 14]
[11 15]]]

28
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Hàm tiện ích trong NumPy

• Hàm tính
toán 1 ngôi

29
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Ví dụ:
import numpy as np
arr = np.arange(10)
print(arr)
print(np.sqrt(arr))

# [0 1 2 3 4 5 6 7 8 9]
# [0. 1. 1.41421356 1.73205081 2.
2.23606798 2.44948974 2.64575131 2.82842712 3.
]

30
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Hàm tiện ích trong NumPy


• Các hàm tính toán 2 ngôi

31
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Ví dụ:
import numpy as np
arr1 = np.arange(10) / 2
arr2 = np.arange(10) / 3 + 1
print(arr1)
print(arr2)
print(np.greater(arr1, arr2))

# [0. 0.5 1. 1.5 2. 2.5 3. 3.5 4. 4.5]


# [1. 1.33333333 1.66666667 2. 2.3333333
2.66666667 3. 3.33333333 3.66666667 4. ]
# [False False False False False False False True True True]

32
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Array-Oriented Programming with Arrays


• NumPy cho phép thể hiện nhiều tác vụ xử lý dữ
liệu với mảng ngắn gọn mà không cần viết
vòng lặp

import numpy as np
import matplotlib.pyplot as plt

points = np.arange(-5, 5, 0.01)


xs, ys = np.meshgrid(points, points)

z = np.sqrt(xs ** 2 + ys ** 2)
plt.imshow(z, cmap = plt.cm.gray)
plt.colorbar()
plt.title("Image plot of $\sqrt{x^2 + y^2}$ for a grid of values")
plt.show()

33
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Điều kiện logic được biểu diễn bởi mảng


• NumPy có các hàm tiện ích khi có các điều kiện logic được biểu diễn bởi mảng
• Cho:
xarr = np.array([1.1, 1.2, 1.3, 1.4, 1.5])
yarr = np.array([2.1, 2.2, 2.3, 2.4, 2.5])
cond = np.array([True, False, True, True, False])

• Để lựa chọn phần tử, thay vì


result = [(x if c else y) for x, y, c in zip(xarr, yarr, cond)]

• Ta có thể sử dụng hàm where


result = np.where(cond, xarr, yarr)

34
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Các hàm toán học, thống kê


• NumPy có rất nhiều hàm liên quan đến thống kê

arr = np.random.randn(2, 3)
[[-0.21050017 -0.47941506 -0.29274799]
print(arr) [-0.60584632 -1.53666652 0.43055528]]
print(arr.mean()) -0.4491034630493929
35
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Mảng Boolean
• Có thể sử dụng sum như 1 cách để đếm các giá trị True trong 1 mảng boolean
arr = np.random.randn(100)
print((arr > 0).sum())

• Có 2 hàm tiện dụng là any() và all() tương ứng với phép or và add

bools = np.array([False, False, True, False])

print(bools.any()) # True
print(bools.all()) # False

36
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Sắp xếp
• Sắp xếp mảng 1 chiều
arr = np.random.randn(6)
print(arr)
arr.sort()
print(arr)

[-1.17996359 -0.38383318 0.40114662 -0.36551224 -0.35595998 0.92213374]


[-1.17996359 -0.38383318 -0.36551224 -0.35595998 0.40114662 0.92213374]

37
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Sắp xếp
• Sắp xếp mảng nhiều chiều
arr = np.random.randn(2,3)
print(arr)
arr.sort(1)
print(arr)

[[ 1.82029148 -1.28506997 -0.18056308]


[ 0.77680604 1.32806397 -0.80290937]]

[[-1.28506997 -0.18056308 1.82029148]


[-0.80290937 0.77680604 1.32806397]]

38
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Toán tử liên quan đến tập hợp


• Hàm unique(): tạo tập sắp xếp tăng dần

names = np.array(['Bob', 'Alice', 'Peter', 'Alice', 'Bob'])


print(np.unique(names)) # ['Alice' 'Bob' 'Peter']

ints = np.array([3, 3, 3, 2, 2, 1, 1, 4, 4])


print(np.unique(ints)) # [1 2 3 4]

39
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Toán tử liên quan đến tập hợp

40
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Nhập/ xuất mảng bằng File


• Ta có thể lưu 1 mảng vào File
arr = np.arange(10)
np.save('some_array', arr)

• Sau đó load mảng từ file

arr1 = np.load('some_array.npy')
print(arr1)

41
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Nhập/ xuất mảng bằng File


• Ta có thể lưu nhiều mảng vào file .npz
arr1 = np.arange(10)
arr2 = np.arange(5)
np.savez('array_archive.npz', a=arr1, b=arr2)

np.savez_compressed('arrays_compressed.npz', a=arr, b=arr)

• Load mảng từ file

arrz = np.load('array_archive.npz')
print(arrz['b'])

42
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Đại số tuyến tính


• NumPy cung cấp cho chúng ta nhiều hàm để tính toán trong lĩnh vực đại số
tuyến tính như, nhân ma trận, phân rã ma trận, tính định thức,…

43
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Đại số tuyến tính

44
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Ví dụ:
import numpy as np
from numpy.linalg import inv, qr

X = np.random.randn(2, 2)
mat = X.T.dot(X)

print(mat)
print(inv(mat))
print(mat.dot(inv(mat)))

[[ 0.26721072 -0.15919219]
[-0.15919219 2.46121607]]

[[3.89235119 0.25175843]
[0.25175843 0.42258703]]

[[ 1.00000000e+00 -2.58814336e-18]
45
[-1.09420189e-16 1.00000000e+00]]
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Số ngẫu nhiên
• Các hàm liên quan

46
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Ví dụ 1: Random Walks
• Sinh ngẫu nhiên bước đi bắt đầu tại 0, bước tới
trước 1 hoặc bước lui -1
import random
import matplotlib.pyplot as plt

position = 0
walk = [position]
steps = 1000
for i in range(steps):
step = 1 if random.randint(0, 1) else -1
position += step
walk.append(position)

plt.plot(walk[:100])
plt.show() 47
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Random Walks với NumPy


import numpy as np

nsteps = 1000
draws = np.random.randint(0, 2, size=nsteps)
steps = np.where(draws > 0, 1, -1)
walk = steps.cumsum()

print(walk.min())
print(walk.max())

print((np.abs(walk) >= 10).argmax())

48
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Mô phỏng nhiều Random Walks


import numpy as np

nwalks = 5000
nsteps = 1000

draws = np.random.randint(0, 2, size=(nwalks, nsteps)) #0 or 1


steps = np.where(draws > 0, 1, -1)

walks = steps.cumsum(1)

hits30 = (np.abs(walks) >= 2).any(1)


print(hits30.sum()) # Number that hit 30 or -30

crossing_times = (np.abs(walks[hits30]) >= 2).argmax(1)


print(crossing_times.mean())

49
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Ví dụ 2: Độ lệch chuẩn & Phương sai


• Ref: Standard Deviation and Variance (mathsisfun.com)

np.random.seed(15)
arr = np.random.randint(low=0, high=100, size=10)
print(arr.mean()) # 42.2
print(arr.std()) # 30.261526729495987

arr = np.random.normal(loc=42, scale=30, size=10)

50
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Ví dụ 3: Image process
import numpy as np
from PIL import Image

im = np.array(Image.open('cat.jpg').convert('L'))
print(type(im))

gr_im = Image.fromarray(im).save('gr_cat.png')

Ref: GitHub - Image processing examples with Numpy, Scipy, and Scikit-image 51
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Tổng kết
• Mảng đa chiều
• Hàm tiện ích trong NumPy
• Array-Oriented Programming with Arrays
• Xuất nhập File
• Đại số tuyến tính
• Số ngẫu nhiên

52
Khoa CÔNG NGHỆ THÔNG TIN
ThS. Nguyễn Thị Lệ Quyên

Tài liệu tham khảo


• Jake VanderPlas, Python Data Science Handbook, O'Reilly Media, Inc., 548 pages, 2016.
• Peter Bruce, Andrew Bruce, Practical Statistics for Data Scientists: 50 Essential
Concepts - 1st Edition, O'Reilly Media; 1st edition, 90 pages, 2017
• Andreas C. Müller, Sarah Guido, Introduction to Machine Learning with Python:
A Guide for Data Scientists 1st Edition, 392 pages, 2016
• Lillian Pierson, Data Science For Dummies - 2nd Edition, John Wiley & Sons
Inc., 385 pages, 2017.
• David R. Anderson, Dennis J. Sweeney, Thomas A. Williams, Statistics for
Business and Economics, South-Western College Pub., 880 pages, 2010.
• Các nguồn internet khác.
53

You might also like