SciPy trong Python Hướng dẫn: Thư viện, Chức năng và Ví dụ là gì
SciPy trong Python
SciPy trong Python là một thư viện mã nguồn mở được sử dụng để giải quyết các vấn đề toán học, khoa học, kỹ thuật và kỹ thuật. Nó cho phép người dùng thao tác dữ liệu và trực quan hóa dữ liệu bằng cách sử dụng nhiều cấp độ cao Python lệnh. SciPy được xây dựng trên Python Phần mở rộng NumPy. SciPy cũng được phát âm là “Sigh Pi”.
Các gói con của SciPy:
- Đầu vào/đầu ra tập tin – scipy.io
- Chức năng đặc biệt - scipy.đặc biệt
- Đại số tuyến tính Operasự - scipy.linalg
- Nội suy – scipy.interpolate
- Tối ưu hóa và phù hợp – scipy.optizes
- Thống kê và số ngẫu nhiên – scipy.stats
- Hội nhập số - scipy.integrate
- Biến đổi Fourier nhanh – scipy.fftpack
- Signal Xử lý - scipy.signal
- Thao tác hình ảnh – scipy.ndimage
Tại sao nên sử dụng SciPy
- SciPy chứa nhiều 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.
- Gói SciPy trong Python 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ột mảng thư viện NumPy.
Numpy VS SciPy
numpy
- Numpy được viết bằng C và sử dụng để tính toán hoặc số.
- Nó nhanh hơn những cái khác Python Thư viện
- Numpy là thư viện hữu ích nhất dành cho Khoa học dữ liệu để thực hiện các phép tính cơ bản.
- Numpy không chứa gì ngoài kiểu dữ liệu mảng thực hiện các thao tác cơ bản nhất như sắp xếp, định hình, lập chỉ mục, v.v.
khoa học viễn tưởng
- SciPy được xây dựng dựa trên NumPy
- Mô-đun SciPy trong Python là phiên bản đầy đủ tính năng của Đại số tuyến tính trong khi Numpy chỉ chứa một số tính năng.
- Hầu hết các tính năng Khoa học dữ liệu mới đều có sẵn trong Scipy thay vì Numpy.
SciPy – Cài đặt và thiết lập môi trường
Bạn cũng có thể cài đặt SciPy trong Windows qua pip
Python3 -m pip install --user numpy scipy
Cài đặt Scipy trên Linux
sudo apt-get install python-scipy python-numpy
Cài đặt SciPy trong Mac
sudo port install py35-scipy py35-numpy
Trước khi chúng ta bắt đầu học SciPy Python, bạn cần biết chức năng cơ bản cũng như các loại mảng khác nhau numpy
Cách tiêu chuẩn để nhập mô-đun SciPy và Numpy:
from scipy import special #same for other modules import numpy as np
Gói đầu vào / đầu ra tập tin
Scipy, gói I/O, có nhiều chức năng để làm việc với các định dạng tệp khác nhau là Matlab, Arff, Wave, Matrix Market, IDL, NetCDF, TXT, CSV và định dạng nhị phân.
Hãy để chúng tôi lấy một định dạng tập tin Python Ví dụ SciPy thường được sử dụng trong MatLab:
import numpy as np from scipy import io as sio array = np.ones((4, 4)) sio.savemat('example.mat', {'ar': array}) data = sio.loadmat(‘example.mat', struct_as_record=True) data['ar']
Đầu ra:
array([[ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.]])
Giải thích mã
- Dòng 1 & 2: Nhập thư viện SciPy cần thiết vào Python với gói I/O và Numpy.
- Dòng 3: Tạo mảng một chiều 4 x 4
- Dòng 4: Lưu trữ mảng trong ví dụ.mat tập tin.
- Dòng 5: Lấy dữ liệu từ ví dụ.mat hồ sơ
- Dòng 6: Kết quả in.
Gói chức năng đặc biệt
- scipy.đặc biệt gói chứa nhiều chức năng của vật lý toán học.
- Chức năng đặc biệt của SciPy bao gồm Căn bậc ba, Hàm mũ, Hàm mũ tổng hợp, Lambert, Hoán vị và Kết hợp, Gamma, Bessel, siêu hình học, Kelvin, beta, hình trụ parabol, Lỗi tương đối theo hàm mũ, v.v..
- Đối với một dòng mô tả tất cả các chức năng này, hãy nhập Python bảng điều khiển:
help(scipy.special) Output: NAME scipy.special DESCRIPTION ======================================== Special functions (:mod:`scipy.special`) ======================================== .. module:: scipy.special Nearly all of the functions below are universal functions and follow broadcasting and automatic array-looping rules. Exceptions are noted.
Hàm căn bậc ba
Hàm Root khối tìm căn bậc ba của các giá trị.
Cú pháp:
scipy.special.cbrt(x)
Ví dụ:
from scipy.special import cbrt #Find cubic root of 27 & 64 using cbrt() function cb = cbrt([27, 64]) #print value of cb print(cb)
Đầu ra: mảng([3., 4.])
Hàm số mũ:
Hàm mũ tính toán từng phần tử 10**x.
Ví dụ:
from scipy.special import exp10 #define exp10 function and pass value in its exp = exp10([1,10]) print(exp)
Đầu ra: [1.e+01 1.e+10]
Hoán vị & Kết hợp
SciPy cũng cung cấp chức năng tính toán Hoán vị và Kết hợp.
Kết hợp - scipy.special.comb(N,k)
Ví dụ:
from scipy.special import comb #find combinations of 5, 2 values using comb(N, k) com = comb(5, 2, exact = False, repetition=True) print(com)
Đầu ra: 15.0
Hoán vị –
scipy.special.perm(N,k)
Ví dụ:
from scipy.special import perm #find permutation of 5, 2 using perm (N, k) function per = perm(5, 2, exact = True) print(per)
Đầu ra: 20
Hàm số mũ log sum
Log Sum Exponential tính log của phần tử đầu vào theo hàm mũ.
Cú pháp:
scipy.special.logsumexp(x)
Chức năng Bessel
Hàm tính thứ tự số nguyên thứ n
Cú pháp:
scipy.special.jn()
Đại số tuyến tính với SciPy
- Đại số tuyến tính của SciPy là sự triển khai của thư viện BLAS và ATLAS LAPACK.
- Hiệu suất của Đại số tuyến tính rất nhanh so với BLAS và LAPACK.
- Thủ tục đại số tuyến tính chấp nhận đối tượng mảng hai chiều và đầu ra cũng là một mảng hai chiều.
Bây giờ hãy làm một số thử nghiệm với scipy.linalg,
Tính yếu tố quyết định của ma trận hai chiều,
from scipy import linalg import numpy as np #define square matrix two_d_array = np.array([ [4,5], [3,2] ]) #pass values to det() function linalg.det( two_d_array )
Đầu ra: -7.0
Ma trận nghịch đảo –
scipy.linalg.inv()
Ma trận nghịch đảo của Scipy tính toán nghịch đảo của bất kỳ ma trận vuông nào.
Hãy xem nào,
from scipy import linalg import numpy as np # define square matrix two_d_array = np.array([ [4,5], [3,2] ]) #pass value to function inv() linalg.inv( two_d_array )
Đầu ra:
array( [[-0.28571429, 0.71428571], [ 0.42857143, -0.57142857]] )
Giá trị riêng và vectơ riêng
scipy.linalg.eig()
- Bài toán phổ biến nhất trong đại số tuyến tính là giá trị riêng và vectơ riêng có thể giải dễ dàng bằng cách sử dụng eig()chức năng.
- Bây giờ chúng ta hãy tìm giá trị riêng của (X) và vectơ riêng tương ứng của ma trận vuông hai chiều.
Ví dụ
from scipy import linalg import numpy as np #define two dimensional array arr = np.array([[5,4],[6,3]]) #pass value into function eg_val, eg_vect = linalg.eig(arr) #get eigenvalues print(eg_val) #get eigenvectors print(eg_vect)
Đầu ra:
[ 9.+0.j -1.+0.j] #eigenvalues [ [ 0.70710678 -0.5547002 ] #eigenvectors [ 0.70710678 0.83205029] ]
Biến đổi Fourier rời rạc – scipy.fftpack
- DFT là một kỹ thuật toán học được sử dụng để chuyển đổi dữ liệu không gian thành dữ liệu tần số.
- FFT (Fast Fourier Transformation) là một thuật toán tính toán DFT
- FFT được áp dụng cho mảng đa chiều.
- Tần số xác định số lượng tín hiệu hoặc bước sóng trong khoảng thời gian cụ thể.
Ví dụ: Hãy vẫy tay và hiển thị bằng thư viện Matplotlib. chúng ta lấy ví dụ hàm tuần hoàn đơn giản của sin(20 × 2πt)
%matplotlib inline from matplotlib import pyplot as plt import numpy as np #Frequency in terms of Hertz fre = 5 #Sample rate fre_samp = 50 t = np.linspace(0, 2, 2 * fre_samp, endpoint = False ) a = np.sin(fre * 2 * np.pi * t) figure, axis = plt.subplots() axis.plot(t, a) axis.set_xlabel ('Time (s)') axis.set_ylabel ('Signal amplitude') plt.show()
Đầu ra:
Bạn có thể thấy điều này. Tần số là 5 Hz và tín hiệu của nó lặp lại sau 1/5 giây - nó được gọi là một khoảng thời gian cụ thể.
Bây giờ chúng ta hãy sử dụng sóng hình sin này với sự trợ giúp của ứng dụng DFT.
from scipy import fftpack A = fftpack.fft(a) frequency = fftpack.fftfreq(len(a)) * fre_samp figure, axis = plt.subplots() axis.stem(frequency, np.abs(A)) axis.set_xlabel('Frequency in Hz') axis.set_ylabel('Frequency Spectrum Magnitude') axis.set_xlim(-fre_samp / 2, fre_samp/ 2) axis.set_ylim(-5, 110) plt.show()
Đầu ra:
- Bạn có thể thấy rõ rằng đầu ra là một mảng một chiều.
- Đầu vào chứa các giá trị phức tạp bằng 0 ngoại trừ hai điểm.
- Trong ví dụ DFT, chúng ta hình dung cường độ của tín hiệu.
Tối ưu hóa và phù hợp trong SciPy – scipy.optizes
- Tối ưu hóa cung cấp một thuật toán hữu ích để giảm thiểu việc khớp đường cong, khớp đa chiều hoặc vô hướng và gốc.
- Hãy lấy một ví dụ về một hàm vô hướng,để tìm hàm vô hướng tối thiểu.
%matplotlib inline import matplotlib.pyplot as plt from scipy import optimize import numpy as np def function(a): return a*2 + 20 * np.sin(a) plt.plot(a, function(a)) plt.show() #use BFGS algorithm for optimization optimize.fmin_bfgs(function, 0)
Đầu ra:
Tối ưu hóa đã kết thúc thành công.
Giá trị hàm hiện tại: -23.241676
Số lần lặp: 4
Đánh giá chức năng: 18
Đánh giá độ dốc: 6
mảng([-1.67096375])
- Trong ví dụ này, việc tối ưu hóa được thực hiện với sự trợ giúp của thuật toán giảm độ dốc từ điểm ban đầu
- Nhưng vấn đề có thể xảy ra là cực tiểu cục bộ thay vì cực tiểu toàn cầu. Nếu chúng ta không tìm được lân cận của cực tiểu toàn cục thì chúng ta cần áp dụng tối ưu hóa toàn cục và tìm hàm cực tiểu toàn cục được sử dụng như Basinhopping() kết hợp trình tối ưu hóa cục bộ.
tối ưu hóa.basinhopping(hàm, 0)
Đầu ra:
fun: -23.241676238045315 lowest_optimization_result: fun: -23.241676238045315 hess_inv: array([[0.05023331]]) jac: array([4.76837158e-07]) message: 'Optimization terminated successfully.' nfev: 15 nit: 3 njev: 5 status: 0 success: True x: array([-1.67096375]) message: ['requested number of basinhopping iterations completed successfully'] minimization_failures: 0 nfev: 1530 nit: 100 njev: 510 x: array([-1.67096375])
Thuật toán Nelder –Mead:
- Thuật toán Nelder-Mead chọn thông qua tham số phương thức.
- Nó cung cấp cách giảm thiểu đơn giản nhất để hoạt động công bằng.
- Thuật toán Nelder – Mead không được sử dụng để đánh giá độ dốc vì có thể mất nhiều thời gian hơn để tìm ra lời giải.
import numpy as np from scipy.optimize import minimize #define function f(x) def f(x): return .4*(1 - x[0])**2 optimize.minimize(f, [2, -1], method="Nelder-Mead")
Đầu ra:
final_simplex: (array([[ 1. , -1.27109375], [ 1. , -1.27118835], [ 1. , -1.27113762]]), array([0., 0., 0.])) fun: 0.0 message: 'Optimization terminated successfully.' nfev: 147 nit: 69 status: 0 success: True x: array([ 1. , -1.27109375])
Xử lý hình ảnh với SciPy – scipy.ndimage
- scipy.ndimage là một mô hình con của SciPy, phần lớn được sử dụng để thực hiện thao tác liên quan đến hình ảnh
- ndimage có nghĩa là hình ảnh chiều “n”.
- SciPy Image Treatment cung cấp chuyển đổi Hình học (xoay, cắt, lật), lọc hình ảnh (sắc nét và khử mũi), hình ảnh hiển thị, phân đoạn hình ảnh, phân loại và trích xuất tính năng.
- Gói MISC trong SciPy chứa các hình ảnh dựng sẵn có thể được sử dụng để thực hiện tác vụ xử lý hình ảnh
Ví dụ: Hãy lấy một ví dụ về biến đổi hình học của hình ảnh
from scipy import misc from matplotlib import pyplot as plt import numpy as np #get face image of panda from misc package panda = misc.face() #plot or show image of face plt.imshow( panda ) plt.show()
Đầu ra:
Bây giờ chúng ta Lật xuống hình ảnh hiện tại:
#Flip Down using scipy misc.face image flip_down = np.flipud(misc.face()) plt.imshow(flip_down) plt.show()
Đầu ra:
Ví dụ: Xoay hình ảnh bằng Scipy,
from scipy import ndimage, misc from matplotlib import pyplot as plt panda = misc.face() #rotatation function of scipy for image – image rotated 135 degree panda_rotate = ndimage.rotate(panda, 135) plt.imshow(panda_rotate) plt.show()
Đầu ra:
Tích hợp với Scipy – Tích hợp số
- Khi chúng ta tích phân bất kỳ hàm nào mà không thể tích phân về mặt phân tích, chúng ta cần chuyển sang tích phân số
- SciPy cung cấp chức năng tích hợp chức năng với tích hợp số.
- scipy.integrate thư viện có các quy tắc tích phân đơn, tích phân đôi, tích phân ba, tích phân bội, tích phân Gauss, Romberg, tích phân hình thang và tích phân Simpson.
Ví dụ: Bây giờ lấy một ví dụ về Tích hợp đơn
Đây a là giới hạn trên và b là giới hạn dưới
from scipy import integrate # take f(x) function as f f = lambda x : x**2 #single integration with a = 0 & b = 1 integration = integrate.quad(f, 0 , 1) print(integration)
Đầu ra:
(0.33333333333333337, 3.700743415417189e-15)
Ở đây hàm trả về hai giá trị, trong đó giá trị đầu tiên là tích phân và giá trị thứ hai là lỗi ước tính trong tích phân.
Ví dụ: Bây giờ hãy lấy một ví dụ SciPy về tích hợp kép. Chúng ta tìm tích phân kép của phương trình sau:
from scipy import integrate import numpy as np #import square root function from math lib from math import sqrt # set fuction f(x) f = lambda x, y : 64 *x*y # lower limit of second integral p = lambda x : 0 # upper limit of first integral q = lambda y : sqrt(1 - 2*y**2) # perform double integration integration = integrate.dblquad(f , 0 , 2/4, p, q) print(integration)
Đầu ra:
(3.0, 9.657432734515774e-14)
Bạn đã thấy kết quả đầu ra ở trên giống như kết quả trước đó.
Tổng kết
- SciPy (phát âm là “Sigh Pi”) là một mã nguồn mở Pythonthư viện dựa trên, được sử dụng trong toán học, tính toán khoa học, Kỹ thuật và tính toán kỹ thuật.
- SciPy chứa nhiều 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 được xây dựng dựa trên NumPy
Tên gói | Mô tả Chi tiết |
---|---|
scipy.io | Đầu vào/đầu ra tập tin |
scipy.đặc biệt | Chức năng đặc biệt |
scipy.linalg | Đại số tuyến tính Operasản xuất |
scipy.interpolate | Phép nội suy |
scipy.optizes | Tối ưu hóa và phù hợp |
scipy.stats | Thống kê và số ngẫu nhiên |
scipy.integrate | Hội nhập số |
scipy.fftpack | Biến đổi Fourier nhanh |
scipy.signal | Signal Đang xử lý |
scipy.ndimage | Thao tác hình ảnh – |