ADMIN: nhanguyen@hcmut.edu.vn

7. Numerical Analysis with Python (Numpy – Matplotlib)

1. Giới thiệu

  • Python hỗ trợ rất mạnh cho việc tính toán khoa học, phân tích số liệu, thống kê và báo cáo kết quả trực quan.
  • Các công cụ hỗ trợ cho việc tính toán và phân tích nằm trong môi trường Scipy (Scientific Computing Tools for Python), bao gồm:
  • Python có sự kết hợp với các gói Numpy, Matplotlip, Scipy và Pandas có thể sử dụng thay thế cho Matlab (licence issue)

Numpy and Scipy

  • Numpy (Numerical Python). Đây là một module mở rộng mã nguồn mở của Python.
  • Cung cấp một thư viện lớn các hàm toán học cao cấp cho số, vector, các dãy nhiều chiều hay ma trận
  • SciPy tương tự Numpy nhưng mở rộng khả năng của Numpy với các thuật toán như: Tối ưu hóa, Hồi quy, chuyển đổi chuỗi Fourier, …
  • Đối tượng chính của Numpy là một dãy đa chiều đồng nhất (homogeneous multidimention array) : ndarray
  • Khởi tạo đối tượng dãy:
    – Một dãy có thể được khởi tạo bằng nhiều cách thông qua các kiểu dữ liệu mặc định của Python (list, set, tuple) thông qua hàm array.
import numpy as np
arr = np.array( [ [1,2,3,4] , [5,6,7,8] ])
print(type(arr))
print(arr)
# Kết quả:
class 'numpy.ndarray’>
[[1 2 3 4]
 [4 6 7 8]]

Một số thuốc tính quan trọng trong ndarray

  • ndarray.ndim : Số chiều của dãy
  • ndarray.shape : chiều của dãy. Thể hiện qua 1 tuple chứa số nguyên kích cỡ của dãy
  • ndarray.size : Tổng số phần tử trong dãy. Bằng tích các phần tử trong shape
import numpy as np
arr = np.array( [ [1,2,3,4] , [5,6,7,8] ])
print(arr.ndim)
print(arr.shape)
print(arr.size)

# Kết quả:
2
(2, 4)
8

Kiểu dữ liệu của dãy sẽ là kiểu dữ liệu của các phần tử trong dãy (dtype).

  • Có thể áp đặt kiểu dữ liệu của chúng bằng cách định nghĩa trong lúc tạo
import numpy as np
arr = np.array( [ [1,2,3,4] , [5,6,7,8] ])
print(arr)
print(arr.dtype)

arr2 = np.array( [ [1.2, 3.4] , [5.6, 7.8] ])
print(arr2)
print(arr2.dtype)

arr3 = np.array( [ [2, 4] , [5, 8] ], dtype = complex)
print(arr3)
print(arr3.dtype)

Chỉ số của dãy:

arr[ chỉ số hàng, chỉ số cột ]

Ví dụ:

import numpy as np
arr = np.array( [ [1, 2, 3, 4] , [5, 6, 7, 8] , [9, 10, 11, 12] ])
b = arr[:2, 1:3] 	# Lấy 2 hàng đầu (hàng 0, 1), cột 1 và 2
print(b)

# Kết quả
[[2 3]
 [6 7]]


print(arr[0,1])		# print “2”
b[0, 0] = 16		# gán giá trị 16 vào vị trí đầu tiên của b
print(arr[0, 1])	# giá trị tương ứng của a sẽ thay đổi (cùng 1 đối tượng được tham chiếu!)

# Kết quả
16
import numpy as np
arr0 = np.array( [ [1, 2, 3, 4] , [5, 6, 7, 8] , [9, 10, 11, 12] ])
arr = arr0.copy()	# Dùng hàm copy() để tạo đối tượng mới
b = arr[:2, 1:3] 	# Lấy 2 hàng đầu (hàng 0, 1), cột 1 và 2
print(b)
# Kết quả
[[2 3]
 [6 7]]

print(arr[0,1])		# print “2”
b[0, 0] = 16		# gán giá trị 16 vào vị trí đầu tiên của b
print(arr0[0, 1])	# giá trị tương ứng của a sẽ thay đổi (cùng 1 đối tượng)

# Kết quả
2

Toán tử trong dãy:

Các toán tử sẽ thực hiện trên từng phần tử của dãy đó

import numpy as np
x = np.array( [ [1, 2], [3, 4] ])
y = np.array( [ [5, 6], [7, 8] ])
print(x+y)
print(np.add(x,y))
print(x-y)
print(np.subtract(x,y))
print(x*y)
print(np.multiply(x,y))
print(x/y)
print(np.divide(x,y))

Chú ý 1: Toán tử nhân (*) trong dãy sẽ không thực hiện phép nhân 2 ma trận như trong Matlab. Thay vào đó sử dụng dot để thực hiện

import numpy as np
x = np.array( [ [1, 2], [3, 4] ])
y = np.array( [ [5, 6], [7, 8] ])
print(x.dot(y))
print(np.dot(x,y))

Chú ý 2: Kiểu array sử dụng phương thức dot sẽ báo lỗi trường hợp [n x 1] * [1 x n]. Thay vào đó sử dụng toán tử (*) để thực hiện

Một số phương thức thường dùng

  • numpy.sum
import numpy as np
x = np.array( [ [1, 2], [3, 4] ])
print(np.sum(x))
print(np.sum(x, axis=0))
print(np.sum(x, axis=1))
  • numpy.transpose
import numpy as np
x = np.array( [ [1, 2], [3, 4] ])
print(x)
print(np.transpose(x))
print(x.T)
  • numpy.zeros
import numpy as np
x = np.zeros( (2,2) )
  • numpy.empty_like
import numpy as np
x = np.array( [ [1, 2], [3, 4] ])
y = np.empty_like(x)
for i in range(2):
    y[i, :] = x[i, :] + i
  • numpy.reshape
import numpy as np
v = np.array([1,2,3,4])
np.reshape(v,(2,2))
  • numpy.ones
  • numpy.full
  • numpy.eye
  • numpy.random
a = np.ones((1,2))
print(a)

b = np.full((2,2), 7) 
print(b)
                       
c = np.eye(2) 
print(c) 

d = np.random.random((2,2))
print(d)

Các phương thức và module khác trong Numy có thể tham khảo tại: https://docs.scipy.org/doc/numpy/reference/

NumPy for Matlab users: https://docs.scipy.org/doc/numpy-dev/user/numpy-for-matlab-users.html

Module Linear Algebra (numpy.linalg)

• numpy.linalg.det (square matrix) – Tính định thức

• numpy.linalg.norm (matrix) – Tính độ lớn

• numpy.linalg.inv (square matrix) – Tính ma trận nghịch đảo

• numpy.linalg.eig (square matrix) – Tìm trị riêng và vector riêng

• numpy.linalg.solve (a, b) – Giải hệ phương trình tuyến tính a.x = b numpy.linalg.matrix_power (square matrix) – Lũy thừa ma trận

Ví dụ (numpy.linalg)

VD: Giải hệ phương trình:

2x+y-1z=9; -5x-y+4z=3; x-6y+7z=-8

Cách 1: nhân ma trận nghịch đảo

Cách 2: sử dụng numpy.solve(a,b)

Sử dụng phương thức numpy.allclose(a,b) để kiểm tra kết quả (nếu a = b sẽ trả về kết quả True ngược lại là False)

Matplotlip

  • Đây là một thư viện vẽ đồ thị, cung cấp các chức năng vẽ tương tự như MATLAB
  • Module quan trọng nhất trong thư viện này là matplotlib.pyplot
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 3 * np.pi, 0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)
plt.plot(x, y_sin)
plt.plot(x, y_cos)
plt.xlabel('x axis label') 
plt.ylabel('y axis label') 
plt.title('Sine and Cosine') 
plt.legend(['Sine', 'Cosine']) 
plt.show()
  • LineStyle and Marker:
‘-‘solid line style‘3’tri_left marker
‘–‘dashed line style‘4’tri_right marker
‘-.’dash-dot line style‘s’square marker
‘:’dotted line style‘p’pentagon marker
‘.’point marker‘*’star marker
‘,’pixel marker‘h’hexagon1 marker
‘o’circle marker‘H’hexagon2 marker
‘v’triangle_down marker‘+’plus marker
‘^’triangle_up marker‘x’x marker
‘<‘triangle_left marker‘D’diamond marker
‘>’triangle_right marker‘d’thin_diamond marker
‘1’tri_down marker‘|’vline marker
‘2’tri_up marker‘_’hline marker
  • Color:
‘b’blue
‘g’green
‘r’red
‘c’cyan
‘m’magenta
‘y’yellow
‘k’black
‘w’white
  • Attribute:
labelTên
linestyleKiểu đường
linewidthĐộ dày của đường
markerKiểu marker
markeredgecolorMàu của biên marker
markeredgewidthĐộ dày của biên marker
markerfacecolorMàu nền marker
markersizeĐộ lớn marker
plt.plot(x, y, color='r', linestyle='--', linewidth=2, marker='p', markerfacecolor='b', markersize=10)
  • SUBPLOTS:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 3 * np.pi, 0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)
plt.subplot(2,1,1)
plt.plot(x, y_sin)
plt.title('Sine') 
plt.subplot(2,1,2)
plt.plot(x, y_cos)
plt.title('Cosine') 
plt.show()
  • AXIS:

axis(): Tạo 1 hệ trục không có tham số

axis([xmin, xmax, ymin, ymax]):  Tạo hệ trục có giới hạn

axis(‘equal’): Chỉnh trục x, y sao cho các bước nhảy là bằng nhau

axis(‘square’): Chỉnh trục x, y sao cho độ dài (xmaxxmin) , (ymaxymin) bằng nhau

axis(‘off’): Tắt hệ trục

  • BOX:

box(on =None): Bật tắt các đường bao quuanh hệ trục.

on = ‘on’ : Bật  
on = ‘off’ : Tắt

  • GRID:

grid(b=‘on’, color=’r’, linestyle=’-‘, linewidth=2)

  • SCATTER:
import numpy as np
import matplotlib.pyplot as plt
N = 50
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = np.pi * (15 * np.random.rand(N))**2
plt.scatter(x, y, s=area, c=colors, alpha=0.5)
plt.show()
  • TEXT:
import numpy as np
import matplotlib.pyplot as plt
N = 4
x = np.random.rand(N)
y = np.random.rand(N)
colors = ['blue', 'red', 'mageta', 'yellow']
area = np.pi * (15 * np.random.rand(N))**2
for i in range(N):
    plt.scatter(x[i], y[i], s=area[i], c=colors[i][0], alpha=0.5)
    plt.text(x[i], y[i], colors[i])
    plt.show()

•Chú thích bằng ký hiệu toán học:

•Dùng cú pháp  r‘$ …… $’ để ký hiệu một biểu thức toán học

•Dùng ^ để ký hiệu chỉ số trên

•Dùng _ để ký hiệu chỉ số dưới Dùng \text để ký hiệu biểu thức toán học

import matplotlip.pyplot as plt
plt.title(r'alpha^2_i > beta^2_i ')
plt.title(r'$\alpha^2_i > \beta^2_i $')
  • IMAGES:
# Tạo 1 file ảnh có tên ENGR351.jpg
import matplotlib.pyplot as plt
import imageio
img = imageio.imread('C:/Users/User/Desktop/ENGR351.jpg') # Chú ý đường dẫn phù hợp
plt.imshow(img)
plt.show()

Các phương thức khác trong Matplotlip có thể tham khảo tại:

https://matplotlib.org/api/pyplot_summary.html

NumPy for Matlab users: https://docs.scipy.org/doc/numpy-dev/user/numpy-for-matlab-users.html