Hướng dẫn scipy python

Scipy (đọc là /ˈsaɪpaɪ'/ "Sigh Pie") là phần mềm nguồn mở cho toán học, khoa học và kỹ thuật. Thư viện SciPy được xây dựng dựa trên thư viện NumPy, cung cấp thao tác mảng N chiều thuận tiện và nhanh chóng. SciPy gồm các gói con (submodule) cho đại số tuyến tính, tối ưu hóa, tích hợp và thống kê.

NumPy và SciPy rất dễ sử dụng, mạnh mẽ và được nhiều nhà khoa học và kỹ sư hàng đầu thế giới lựa chọn. Nếu bạn cần thao tác số trên máy tính và hiển thị hoặc công bố kết quả, hãy thử SciPy!

Vì sao nên sử dụng Scipy?

  • SciPy chứa nhiều loại gói phụ giúp giải quyết vấn đề phổ biến nhất liên quan đến tính toán khoa học.
  • SciPy là thư viện Khoa học được sử dụng nhiều nhất chỉ sau Thư viện Khoa học GNU cho C/C ++ hoặc Matlab.
  • Dễ sử dụng và hiểu cũng như sức mạnh tính toán nhanh.
  • Nó có thể hoạt động trên mảng (array) của thư viện NumPy.

Cài đặt thư viện

  • Thông qua các phân phối: Anaconda, Miniconda, WinPython, Pyzo.
  • Sử dụng pip: python-m pip install --user scipy
    Bạn có thể cài đặt cùng lúc nhiều thư viện với pip: python-m pip install --user numpy scipy matplotlib ipython jupyter pandas sympy nos

Lưu ý: Numpy phải được cài đặt trước. Bạn cũng nên cài đặt Matplotlib khi sử dụng Scipy. Một số cách cài đặt Scipy khác chi tiết tại ĐÂY.

Khai báo thư viện

Để đơn giản và thuận tiện, các gói con của thư viện Scipy và các thư viện Numpy, Matplotlib thường được khai báo dưới dạng:

from scipy import special
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

special là một gói con của Scipy. Các gói con khác được khai báo tương tự.

Các hàm cơ bản

Scipy được xây dựng trên Numpy nên bạn có thể sử dụng các hàm của Numpy để thực hiện tất cả các thao tác array cơ bản. Chi tiết về các hàm này các bạn có thể tìm ở NumPy Reference Guide hoặc sử dụng các lệnh help, info và source. Bên dưới là ví dụ về một số thao tác array cơ bản.

Ví dụ 1: Ví dụ này được viết trong Python Shell.

>>> # khai báo numpy
>>> import numpy as np
>>> # Hàm mrid()
>>> np.mgrid[0:5,0:4]
array([[[0, 0, 0, 0],
        [1, 1, 1, 1],
        [2, 2, 2, 2],
        [3, 3, 3, 3],
        [4, 4, 4, 4]],

       [[0, 1, 2, 3],
        [0, 1, 2, 3],
        [0, 1, 2, 3],
        [0, 1, 2, 3],
        [0, 1, 2, 3]]])
>>> # Hàm mrid() số ảo
>>> np.mgrid[0:5:4j,0:4:3j]
array([[[0.        , 0.        , 0.        ],
        [1.66666667, 1.66666667, 1.66666667],
        [3.33333333, 3.33333333, 3.33333333],
        [5.        , 5.        , 5.        ]],

       [[0.        , 2.        , 4.        ],
        [0.        , 2.        , 4.        ],
        [0.        , 2.        , 4.        ],
        [0.        , 2.        , 4.        ]]])
>>> # Hàm đa thức
>>> from numpy import poly1d
>>> p = poly1d([2,6])
>>> print(p)
 
2 x + 6
>>> # Bình phương hàm p
>>> print(p*p)
   2
4 x + 24 x + 36
>>> # Đạo hàm của p
>>> print(p.deriv())
 
2
>>> # Giá trị p tại x = 1, 2, 10
>>> p([1,2,10])
array([ 8, 10, 26])
>>> # Hàm select() để lấy ra array theo điều kiện
>>> x = np.arange(15)
>>> dieu_kien = [x< 10, x>=5]
>>> chon_ra = [x, x**3]
>>> np.select(dieu_kien, chon_ra)
array([ 0,  1,  8, 27, 64,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])
>>> dieu_kien = [x>12, x<3]
>>> np.select(dieu_kien, chon_ra)
array([ 0,  1,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 13, 14])
>>> 

Tổng quan về các gói con của Scipy

Việc sử dụng thư viện SciPy yêu cầu (hoặc tùy chọn phụ thuộc vào) một số thư viện khác để hoạt động, phụ thuộc chính là Python và NumPy. Nó đòi hỏi một bộ sưu tập lớn hơn các thư viện và công cụ để xây dựng thư viện hoặc xây dựng tài liệu. Các công cụ và thư viện luôn thay đổi. SciPy nhằm mục đích tương thích với một số bản phát hành của các thư viện và công cụ phụ thuộc. Việc buộc cơ sở người dùng đến các thành phần khác để nâng cấp cho mỗi bản phát hành sẽ làm giảm đáng kể giá trị của SciPy. Tuy nhiên, việc duy trì khả năng tương thích ngược với các công cụ / thư viện cũ đặt ra những hạn chế trong đó các chức năng và khả năng mới hơn có thể được kết hợp. SciPy có một cách tiếp cận có phần bảo thủ là duy trì khả năng tương thích với một số bản phát hành chính của Python và NumPy trên các nền tảng chính. Do đó người dùng cần chú ý sự tương thích giữa phiên bản của các thư viện khác có liên quan với phiên bản của Scipy. Những thông tin được tổng hợp ở mục Toolchain Roadmap của tài liệu hướng dẫn Scipy. 

Scipy có nhiều gói con và liên tục được phát triển, bổ sung tính năng mới. Bảng tổng hợp các gói con của Scipy theo thứ tự alphabet:

gói con Miêu tả
cluster Thuật toán phân cụm (Clustering Algorithms)
constants Các hằng số toán học và vật lý
fftpack Hàm biến đổi Fourier nhanh (Fast Fourier Transform)
integrate Giải phương trình vi phân và tích phân
interpolate Nội suy và làm mịn spline
io Đầu vào và đầu ra
linalg Đại số tuyến tính
ndimage Xử lý ảnh N chiều
odr Hồi quy khoảng cách trực giao
optimize Tối ưu hóa và chương trình root-finding
signal Xử lý tín hiệu
sparse Ma trận sparse và các đoạn chương trình liên quan
spatial Các cấu trúc dữ liệu không gian và thuật toán
special Các hàm toán học đặc biệt
stats Các hàm và phân phối thống kê

Scipy sắp tới sẽ phát triển hỗ trợ BLAS và LAPACK, thêm mảng sparse bên cạnh ma trận sparse, cải tiến biến đổi Fourier, hỗ trợ cho mảng phân tán và mảng GPU, cải thiện các bản dựng nguồn (source builds) trên Windows và các cải tiến thống kê. Mỗi gói con đều được đội đóng góp (Contribute) xây dựng lộ trình phát triển riêng. Chi tiết tại đây. Tiếp theo chúng ta cùng tìm hiểu từng gói con.

Chi tiết từng gói con

1. Gói phân cụm (scipy.cluster)

Các thuật toán phân cụm rất hữu ích trong lý thuyết thông tin, phát hiện mục tiêu, truyền thông, nén và các lĩnh vực khác. scipy.cluster gồm scipy.cluster.vq và scipy.cluster.hierarchy.

1.1. Phân cụm K-mean và lượng tử hóa vestor (scipy.cluster.vq)

Thuật toán k-mean lấy đầu vào số lượng cụm để tạo k và một tập các vectơ quan sát thành cụm. Nó trả về một tập hợp các trọng tâm (centroid), một trọng tâm cho mỗi cụm k. Một vectơ quan sát được phân loại với số cụm hoặc chỉ số trọng tâm của trọng tâm gần nó nhất. 

Một vectơ v thuộc cụm i nếu nó gần với trọng tâm i hơn bất kỳ trọng tâm nào khác. Nếu v thuộc về i, chúng ta nói trọng tâm i là trọng tâm thống trị của v. Thuật toán k-mean cố gắng giảm thiểu biến dạng, được định nghĩa là tổng khoảng cách bình phương giữa mỗi vectơ quan sát và trọng tâm thống trị của nó. Việc giảm thiểu đạt được bằng cách phân loại lại các quan sát thành các cụm và tính toán lại các trọng tâm cho đến khi đạt được một cấu hình trong đó các trọng tâm được ổn định. Người ta cũng có thể định nghĩa một số lần lặp tối đa.

Các hàm hiện tại trong scipy.cluster.vq là whiten()vq(), kmeans() và kmeans2(). Bên dưới là một số ví dụ cho mô-đun này.

Ví dụ: Các hàm trong scipy.cluster.vq

>>> # hàm whiten()- Chuẩn hóa một nhóm quan sát trên cơ sở từng tính năng.
>>> import numpy as np
>>> from scipy.cluster.vq import whiten
>>> features  = np.array([[2.9, 3.3, 4.7], [7.5, 6.5, 7.2],[0.8, 0.1, 0.7,]])
>>> whiten(features)
array([[1.03644899, 1.26301815, 1.75565531],
       [2.68047153, 2.48776302, 2.68951452],
       [0.28591696, 0.03827328, 0.26148058]])
>>> # hàm vq - Gán mã từ một cuốn sách mã cho các quan sát.
>>> from scipy.cluster.vq import vq
>>> code_book = np.array([[1.,1.,1.,],[2.,1.,1.]])
>>> vq(features, code_book)
(array([1, 1, 0]), array([4.44859528, 9.9468588 , 0.96953597]))
>>> # hàm kmeans - Thực hiện k-mean trên một tập các vectơ quan sát tạo thành các cụm k
>>> from scipy.cluster.vq import vq, kmeans, whiten
>>> import matplotlib.pyplot as plt
>>> features = np.array([[],])
>>> from numpy import random
>>> features = np.array([[ 1.3,2.2],
                     [ 2.1,2.4],
                     [ 0.4,0.6],
                     [ 0.3,2.8],
                     [ 0.1,0.2],
                     [ 0.2,1.4],
                     [ 2.0,0.1],
                     [ 4.3,3.9],
                     [ 3.0,4.0]])
>>> whitened = whiten(features)
>>> book = np.array((whitened[0],whitened[1]))
>>> kmeans(whitened,book)
(array([[0.52090714, 0.86997969],
       [2.27745447, 2.45501118]]), 0.8168475927077372)
>>> 
>>> random.seed((500,1500))
>>> codes = 4
>>> kmeans(whitened,codes)
(array([[0.89644484, 1.76379444],
       [1.45369434, 0.07150518],
       [2.65299217, 2.82445461],
       [0.16959767, 0.52437132]]), 0.39112017893552065)
>>> # Tạo 60 điểm dữ liệu trong 2 cụm a và b
>>> pts = 60
>>> a = np.random.multivariate_normal([0, 0], [[4, 1], [1, 4]], size=pts)
>>> b = np.random.multivariate_normal([20, 10], [[14, 2], [2, 1]], size=pts)
>>> features = np.concatenate((a, b))
>>> # Whiten dữ liệu
>>> whitened = whiten(features)
>>> # Tìm 2 cụm dữ liệu
>>> codebook, distortion = kmeans(whitened, 2)
>>> # Vẽ Whiten dữ liệu và tâm cụm (màu đỏ)
>>> plt.scatter(whitened[:, 0], whitened[:, 1])
<matplotlib.collections.PathCollection object at 0x0000028D5D18A828>
>>> plt.scatter(codebook[:, 0], codebook[:, 1], c='r')
<matplotlib.collections.PathCollection object at 0x0000028D5D18AC50>
>>> plt.show()
>>># hàm k-mean2
>>> from scipy.cluster.vq import kmeans2
>>> # Tạo mảng z có hình dạng (100, 2) chứa hỗn hợp các mẫu từ ba phân phối bình thường đa biến.
>>> np.random.seed(12345678)
>>> a = np.random.multivariate_normal([0, 6], [[2, 1], [1, 2.5]], size=45)
>>> b = np.random.multivariate_normal([1, 0], [[1, -1], [-1, 3]], size=35)
>>> c = np.random.multivariate_normal([6, 5], [[4, 0], [0, 1.]], size=25)
>>> z = np.concatenate((a, b, c))
>>> np.random.shuffle(z)
>>> # Tính toán 3 cụm
>>> centroid, label = kmeans2(z, 3, minit='points')
>>> centroid
array([[ 6.17155178,  4.85018346],
       [ 0.89380981, -0.14430193],
       [ 0.03293515,  6.16629408]])
>>> # Số điểm trong mỗi cụm
>>> counts = np.bincount(label)
>>> counts
array([24, 35, 46], dtype=int64)
>>> # Vẽ các cụm
>>> w0 = z[label == 0]
>>> w1 = z[label == 1]
>>> w2 = z[label == 2]
>>> plt.plot(w0[:, 0], w0[:, 1], 'o', alpha=0.5, label='cụm 1')
[<matplotlib.lines.Line2D object at 0x0000028D5D00AA20>]
>>> plt.plot(w1[:, 0], w1[:, 1], 's', alpha=0.5, label='cụm 2')
[<matplotlib.lines.Line2D object at 0x0000028D5D00ADD8>]
>>> plt.plot(w2[:, 0], w2[:, 1], 'd', alpha=0.5, label='cụm 3')
[<matplotlib.lines.Line2D object at 0x0000028D5D00AD30>]
>>> plt.plot(centroid[:, 0], centroid[:, 1], 'ro', label='tâm')
[<matplotlib.lines.Line2D object at 0x0000028D5D00AB00>]
>>> plt.axis('equal')
(-3.2328087766702582, 8.417272880962955, -3.9724381733346927, 10.306803368482795)
>>> plt.legend(shadow=True)
<matplotlib.legend.Legend object at 0x0000028D5D019908>
>>> plt.show()

 

Hướng dẫn scipy python

Ảnh kmean()
Hướng dẫn scipy python

Ảnh kmean2()

Các bạn tham khảo thông tin chi tiết cho mô-đun này tại đây.
1.2. Mô-đun scipy.cluster.hierarchy

Mô-đun hierarchy cung cấp các chức năng cho phân cụm phân cấp và kết tụ. Các tính năng của nó bao gồm tạo các cụm phân cấp từ ma trận khoảng cách, tính toán thống kê trên các cụm, cắt liên kết để tạo ra các cụm phẳng và hình dung các cụm với cây phả hệ. Mô-đun này có nhiều nhóm hàm.

  • Nhóm hàm fcluster(Z, t[, criterion, depth, R, monocrit]), fclusterdata(X, t[, criterion, metric, …]) và leaders(Z, T) cắt các cụm phân cấp thành các cụm phẳng hoặc tìm các gốc của rừng được hình thành bằng cách cắt bằng cách cung cấp các id cụm phẳng của mỗi quan sát.
  • Nhóm hàm linkage(y[, method, metric, optimal_ordering])single(y)complete(y)average(y)weighted(y)centroid(y)median(y) và ward(y) cho phân cụm kết tụ.
  • Nhóm hàm cophenet(Z[, Y])from_mlab_linkage(Z)inconsistent(Z[, d])maxinconsts(Z, R)maxdists(Z)maxRstat(Z, R, i) và to_mlab_linkage(Z) cho tính toán thống kê trên hệ thống phân cấp.
  • Hàm dendrogram(Z[, p, truncate_mode, …]) để hình dung các cụm phẳng.
  • Nhóm hàm ClusterNode(id[, left, right, dist, count])leaves_list(Z), to_tree(Z[, rd])cut_tree(Z[, n_clusters, height])optimal_leaf_ordering(Z, y[, metric]): Đây là các cấu trúc dữ liệu và các hàm để biểu diễn các cấu trúc phân cấp như các đối tượng cây.
  • Nhóm hàm is_valid_im(R[, warning, throw, name]), is_valid_linkage(Z[, warning, throw, name]), is_isomorphic(T1, T2), is_monotonic(Z), correspond(Z, Y)num_obs_linkage(Z): Đây là các vị từ để kiểm tra tính hợp lệ của ma trận liên kết và ma trận không nhất quán cũng như để kiểm tra sự đẳng cấu của hai phép gán cụm phẳng.
  • Hàm set_link_color_palette(palette) để đặt danh sách mã màu matplotlib để sử dụng cho cây phả hệ.

Ví dụ: Một số hàm trong mô-đun hierarchy

>>># hàm fcluster: Hình thành các cụm phẳng từ cụm phân cấp được xác định bởi ma trận liên kết đã cho.
>>> from scipy.cluster.hierarchy import ward, fcluster
>>> from scipy.spatial.distance import pdist
>>> X = [[0, 0], [0, 1], [1, 0],
         [0, 4], [0, 3], [1, 4],
         [4, 0], [3, 0], [4, 1],
         [4, 4], [3, 4], [4, 3]]
>>> # Tạo ma trận Z
>>> Z = ward(pdist(X))
>>> fcluster(Z, t=0.9, criterion='distance')
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12], dtype=int32)
>>>
>>># hàm cophenet(Z[, Y]): Tính khoảng cách cophenetic giữa mỗi lần quan sát trong cụm phân cấp được xác định bởi liên kết Z.
>>> from scipy.cluster.hierarchy import single, cophenet
>>> from scipy.spatial.distance import pdist, squareform
>>> X = [[0, 0], [0, 1], [1, 0],
         [0, 4], [1, 1], [1, 4],
         [4, 1], [2, 0], [4, 2],
         [4, 4], [3, 3], [4, 3]]
>>> # Tạo ma trận Z
>>> Z = single(pdist(X))
>>> cophenet(Z)
array([1.        , 1.        , 2.23606798, 1.        , 2.23606798,
       2.23606798, 1.        , 2.23606798, 2.23606798, 2.23606798,
       2.23606798, 1.        , 2.23606798, 1.        , 2.23606798,
       2.23606798, 1.        , 2.23606798, 2.23606798, 2.23606798,
       2.23606798, 2.23606798, 1.        , 2.23606798, 2.23606798,
       1.        , 2.23606798, 2.23606798, 2.23606798, 2.23606798,
       2.23606798, 1.        , 2.23606798, 2.23606798, 2.23606798,
       2.23606798, 2.23606798, 2.23606798, 2.23606798, 2.23606798,
       1.        , 2.23606798, 2.23606798, 2.23606798, 2.23606798,
       2.23606798, 2.23606798, 2.23606798, 2.23606798, 2.23606798,
       2.23606798, 2.23606798, 1.        , 1.        , 1.        ,
       1.        , 2.23606798, 2.23606798, 2.23606798, 2.23606798,
       1.        , 1.        , 1.        , 1.        , 1.        ,
       1.        ])
>>># Dùng hàm squareform() để output dưới dạng ma trận thông thường
>>> squareform(cophenet(Z))
array([[0.        , 1.        , 1.        , 2.23606798, 1.        ,
        2.23606798, 2.23606798, 1.        , 2.23606798, 2.23606798,
        2.23606798, 2.23606798],
       [1.        , 0.        , 1.        , 2.23606798, 1.        ,
        2.23606798, 2.23606798, 1.        , 2.23606798, 2.23606798,
        2.23606798, 2.23606798],
       [1.        , 1.        , 0.        , 2.23606798, 1.        ,
        2.23606798, 2.23606798, 1.        , 2.23606798, 2.23606798,
        2.23606798, 2.23606798],
       [2.23606798, 2.23606798, 2.23606798, 0.        , 2.23606798,
        1.        , 2.23606798, 2.23606798, 2.23606798, 2.23606798,
        2.23606798, 2.23606798],
       [1.        , 1.        , 1.        , 2.23606798, 0.        ,
        2.23606798, 2.23606798, 1.        , 2.23606798, 2.23606798,
        2.23606798, 2.23606798],
       [2.23606798, 2.23606798, 2.23606798, 1.        , 2.23606798,
        0.        , 2.23606798, 2.23606798, 2.23606798, 2.23606798,
        2.23606798, 2.23606798],
       [2.23606798, 2.23606798, 2.23606798, 2.23606798, 2.23606798,
        2.23606798, 0.        , 2.23606798, 1.        , 1.        ,
        1.        , 1.        ],
       [1.        , 1.        , 1.        , 2.23606798, 1.        ,
        2.23606798, 2.23606798, 0.        , 2.23606798, 2.23606798,
        2.23606798, 2.23606798],
       [2.23606798, 2.23606798, 2.23606798, 2.23606798, 2.23606798,
        2.23606798, 1.        , 2.23606798, 0.        , 1.        ,
        1.        , 1.        ],
       [2.23606798, 2.23606798, 2.23606798, 2.23606798, 2.23606798,
        2.23606798, 1.        , 2.23606798, 1.        , 0.        ,
        1.        , 1.        ],
       [2.23606798, 2.23606798, 2.23606798, 2.23606798, 2.23606798,
        2.23606798, 1.        , 2.23606798, 1.        , 1.        ,
        0.        , 1.        ],
       [2.23606798, 2.23606798, 2.23606798, 2.23606798, 2.23606798,
        2.23606798, 1.        , 2.23606798, 1.        , 1.        ,
        1.        , 0.        ]])
>>># hàm fcluster - gán các điểm dữ liệu gốc cho các cụm đơn. Việc gán này chủ yếu phụ thuộc vào ngưỡng khoảng cách t - khoảng cách giữa các cụm tối đa được phép
>>> from scipy.cluster.hierarchy import ward, fcluster
>>> from scipy.spatial.distance import pdist
>>> X = [[0, 1], [0, 1], [1, 0],
         [1, 1], [0, 3], [1, 1],
         [2, 3], [3, 0], [4, 1],
         [2, 2], [3, 4], [4, 3]]
>>> # Tạo ma trận Z
>>> Z = ward(pdist(X))
>>> fcluster(Z, t=0.6, criterion='distance')
array([ 1,  1,  3,  2, 10,  2,  8,  4,  5,  9,  6,  7], dtype=int32)
>>> 

Để tìm hiểu thêm thông tin các hàm trong mô-đun hierarchy, các bạn có thể xem tại đây.

2. Gói hằng số (scipy.constants)

Gói constants gồm các hằng số vật lý, toán học và các đơn vị. Trong gói này có một số hàm để gọi giá trị hằng số, chuyển đổi các đơn vị.

Ví dụ: Một số hàm trong gói constants 

>>> import numpy as np
>>># import hàm constants
>>> from scipy import constants
>>># Lấy giá trị hằng số theo key
>>> constants.value(u'proton mass')
1.67262192369e-27
>>># Lấy đơn vị của hằng số theo key
>>> constants.unit(u'elementary charge')
'C'
>>># Lấy độ chính xác tương đối của hằng số theo key
>>> constants.precision(u'neutron mass')
5.671887297281165e-10
>>># import hàm find và physical_constants
>>> from scipy.constants import find, physical_constants
>>># Tìm các key trong từ điển các hằng số vật lý chứa‘boltzmann’?
>>> find('structure')
['fine-structure constant', 'inverse fine-structure constant']
>>># Lấy thông tin hằng số được gọi là ‘fine-structure constant’:
>>> physical_constants['fine-structure constant']
(0.0072973525693, '', 1.1e-12)
>>> # Chuyển đổi nhiệt độ
>>> convert_temperature(np.array([0, 100]), 'Celsius', 'Fahrenheit')
array([ 32., 212.])
>>>

3. Gói biến đổi Fourier (scipy.fftscipy.fftpack)

Gói scipy.fftpack là gói biến đổi Fourier được phát triển trước, nay trở thảnh di sản và được thay thế bằng gói scipy.fft. Gói scipy.fft có đa dạng các hàm giúp giải quyết dễ dàng biến đổi Fourier. Gói được phân thành các nhóm hàm:

  • Biến đổi Fourier nhanh (FFTs) gồm 18 hàm như fft(), ifft(), fft2(), v.v.
  • Biến đổi Sin và Cosine rời rạc (DST và DCT) gồm 8 hàm như dct(), idct(), dctn(), v.v.
  • Các chức năng trợ giúp với 7 hàm như fftshift(), fftfreq(), rfftfreq(), v.v.
  • Kiểm soát backend như set_backend(), skip_backend(), set_global_backend()register_backend().

Ví dụ: Biến đổi Fourier nhanh bằng hàm fft lên hàm a(t) = sin(10*2πt) + cos(20*2πt)

from matplotlib import pyplot as plt
import numpy as np 
# Tạo hàm trpng miền thời gian
# Tần số theo đơn vị Hz
fre  = 10
#Tỉ lệ mẫu
fre_samp = 100
#Thời gian
t = np.linspace(0, 2, 2 * fre_samp, endpoint = False )
# Hàm sin(f*2pi*t)+ cos(2f*2pi*t)
a = np.sin(fre  * 2 * np.pi * t) + np.cos(2*fre  * 2 * np.pi * t)
# Vẽ hàm
figure, axis = plt.subplots()
axis.plot(t, a)
axis.set_xlabel ('Thời gian (s)')
axis.set_ylabel ('Cường độ tín hiệu')
plt.figure(1)

# Sử dụng hàm fft chuyển sang miền tần số
from scipy import fft
# Thực hiện biến đổi fft
A = fft.fft(a)
frequency = fft.fftfreq(len(a)) * fre_samp
# Vẽ hàm trong miền tần số
figure, axis = plt.subplots()
axis.stem(frequency, np.abs(A), use_line_collection=True)
axis.set_xlabel('Tần số (Hz)')
axis.set_ylabel('Độ lớn phổ tần số')
axis.set_xlim(-fre_samp / 2, fre_samp/ 2)
axis.set_ylim(-5, 120)
plt.show()

Ảnh hàm số trong miền thời gian

Hướng dẫn scipy python

Ảnh hàm số trong miền tần số 

Hướng dẫn scipy python
 
Các bạn có thể tham khảo thêm các hàm biến đổi Fourier hữu ích khác tại đây.

Tạm kết

Mình vừa giới thiệu cho các bạn vài nét tổng quan cũng như 3 submodule đầu tiên của Scipy. Các submodule tiếp theo sẽ được trình bày trong phần tiếp theo. Cảm ơn các bạn đã đọc. Hẹn các bạn ở phần 2.

Tham khảo

1. https://scipy.org/

2. https://en.wikipedia.org/wiki/SciPy