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:

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:

Biến đổi Fourier rời rạc

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:

Biến đổi Fourier rời rạc

  • 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 và phù hợp trong SciPy

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:

Xử lý hình ảnh với SciPy

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:

Xử lý hình ảnh với SciPy

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:

Xử lý hình ảnh với SciPy

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

Tích hợp với Scipy

Đâ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:

Tích hợp với Scipy

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 –