ไซปีเข้าแล้ว Python บทช่วยสอน: คืออะไร ไลบรารี ฟังก์ชั่น และตัวอย่าง

ไซปีเข้าแล้ว Python

ไซปีเข้าแล้ว Python เป็นห้องสมุดโอเพ่นซอร์สที่ใช้สำหรับการแก้ปัญหาทางคณิตศาสตร์ วิทยาศาสตร์ วิศวกรรมศาสตร์ และทางเทคนิค ช่วยให้ผู้ใช้สามารถจัดการข้อมูลและแสดงภาพข้อมูลโดยใช้ระดับสูงที่หลากหลาย Python คำสั่ง SciPy ถูกสร้างขึ้นบน Python ส่วนขยาย NumPy SciPy ยังออกเสียงว่า "Sigh Pi"

แพ็คเกจย่อยของ SciPy:

ทำไมต้องใช้ SciPy

  • SciPy มีแพ็คเกจย่อยที่หลากหลายซึ่งช่วยในการแก้ไขปัญหาทั่วไปที่เกี่ยวข้องกับการคำนวณทางวิทยาศาสตร์
  • แพ็คเกจ SciPy ใน Python เป็นห้องสมุดวิทยาศาสตร์ที่มีผู้ใช้มากที่สุดเป็นอันดับสองรองจาก GNU Scientific Library สำหรับ C/C++ หรือของ Matlab
  • ใช้งานง่ายและเข้าใจง่ายพร้อมพลังการคำนวณที่รวดเร็ว
  • สามารถใช้งานบนอาร์เรย์ของไลบรารี NumPy ได้

นัมปี้ VS ไซปี้

นัมปี้

  • Numpy เขียนด้วยภาษา C และใช้สำหรับการคำนวณทางคณิตศาสตร์หรือตัวเลข
  • มันเร็วกว่าที่อื่น Python ห้องสมุด
  • Numpy เป็นไลบรารีที่มีประโยชน์ที่สุดสำหรับ Data Science ในการคำนวณขั้นพื้นฐาน
  • Numpy ประกอบด้วยเพียงแค่ชนิดข้อมูลแบบอาร์เรย์ซึ่งดำเนินการพื้นฐานที่สุด เช่น การเรียงลำดับ การจัดรูปร่าง การสร้างดัชนี เป็นต้น

วิทย์

  • SciPy ถูกสร้างขึ้นบน NumPy
  • โมดูล SciPy ใน Python เป็นเวอร์ชันที่มีคุณสมบัติครบถ้วนของ Linear Algebra ในขณะที่ Numpy มีคุณสมบัติเพียงไม่กี่อย่างเท่านั้น
  • ฟีเจอร์ Data Science ใหม่ส่วนใหญ่มีให้ใช้งานใน Scipy แทนที่จะเป็น Numpy

SciPy – การติดตั้งและการตั้งค่าสภาพแวดล้อม

คุณยังสามารถติดตั้ง SciPy ได้ Windows ผ่าน pip

Python3 -m pip install --user numpy scipy 

ติดตั้ง Scipy บน Linux

sudo apt-get install  python-scipy python-numpy

ติดตั้ง SciPy ใน Mac

sudo port install py35-scipy py35-numpy

ก่อนที่เราจะเริ่มเรียนรู้ SciPy Pythonคุณจำเป็นต้องรู้ฟังก์ชันพื้นฐานตลอดจนอาร์เรย์ประเภทต่างๆ นำพาย

วิธีมาตรฐานในการนำเข้าโมดูล SciPy และ Numpy:

from scipy import special   #same for other modules
import numpy as np

แพคเกจไฟล์อินพุต / เอาท์พุต

แพ็คเกจ Scipy, I/O มีฟังก์ชันมากมายสำหรับการทำงานกับรูปแบบไฟล์ต่างๆ ได้แก่ Matlab, Arff, Wave, Matrix Market, IDL, NetCDF, TXT, CSV และรูปแบบไบนารี

ให้เราใช้รูปแบบไฟล์เดียว Python ตัวอย่าง SciPy ที่ใช้เป็นประจำใน 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']

Output:

array([[ 1., 1., 1., 1.],
           [ 1., 1., 1., 1.],
           [ 1., 1., 1., 1.],
           [ 1., 1., 1., 1.]])

คำอธิบายรหัส

  • บรรทัดที่ 1 และ 2: นำเข้าไลบรารี SciPy ที่จำเป็นเข้ามา Python พร้อมแพ็คเกจ I/O และ Numpy
  • บรรทัดที่ 3 : สร้างอาร์เรย์ขนาด 4 x 4 มิติ
  • บรรทัดที่ 4 : จัดเก็บอาร์เรย์ใน ตัวอย่าง.เสื่อ ไฟล์
  • 5 แนว: รับข้อมูลจาก ตัวอย่าง.เสื่อ ไฟล์
  • บรรทัดที่ 6 : พิมพ์ผลงาน

แพ็คเกจฟังก์ชั่นพิเศษ

  • เผ็ด.พิเศษ แพ็คเกจประกอบด้วยฟังก์ชันมากมายของฟิสิกส์คณิตศาสตร์
  • ฟังก์ชันพิเศษของ SciPy ประกอบด้วยคิวบิกรูท, เอ็กซ์โปเนนเชียล, ผลรวมของล็อกเอ็กซ์โปเนนเชียล, แลมเบิร์ต, การเรียงสับเปลี่ยนและการรวมกัน, แกมมา, เบสเซล, ไฮเปอร์จีโอเมตริก, เคลวิน, เบตา, ทรงกระบอกพาราโบลา, เอ็กซ์โปเนนเชียลข้อผิดพลาดสัมพัทธ์ ฯลฯ
  • สำหรับคำอธิบายฟังก์ชันทั้งหมดเหล่านี้ ให้พิมพ์บรรทัดเดียว Python คอนโซล:
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.

ฟังก์ชันคิวบิกรูท

ฟังก์ชันคิวบิกรูทค้นหารากที่สามของค่า

ไวยากรณ์:

scipy.special.cbrt(x)

ตัวอย่าง:

from scipy.special import cbrt
#Find cubic root of 27 & 64 using cbrt() function
cb = cbrt([27, 64])
#print value of cb
print(cb)

Output: อาร์เรย์ ([3., 4.])

ฟังก์ชันเลขชี้กำลัง:

ฟังก์ชันเลขชี้กำลังคำนวณองค์ประกอบ 10**x

ตัวอย่าง:

from scipy.special import exp10
#define exp10 function and pass value in its
exp = exp10([1,10])
print(exp)

Output: [1.e+01 1.e+10]

การเรียงสับเปลี่ยนและการรวมกัน

SciPy ยังมีฟังก์ชันในการคำนวณการเรียงสับเปลี่ยนและการรวมกัน

ชุดค่าผสม – scipy.special.comb(N,k)

ตัวอย่าง:

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)

Output: 15.0

พีชคณิต –

scipy.special.perm(N,k)

ตัวอย่าง:

from scipy.special import perm
#find permutation of 5, 2 using perm (N, k) function
per = perm(5, 2, exact = True)
print(per)

Output: 20

ฟังก์ชันเลขชี้กำลังผลรวมของบันทึก

Log Sum Exponential คำนวณบันทึกขององค์ประกอบอินพุตเลขชี้กำลังผลรวม

ไวยากรณ์ :

scipy.special.logsumexp(x) 

ฟังก์ชันเบสเซล

ฟังก์ชันการคำนวณลำดับจำนวนเต็มลำดับที่ N

ไวยากรณ์ :

scipy.special.jn()

พีชคณิตเชิงเส้นกับ SciPy

  • พีชคณิตเชิงเส้นของ SciPy เป็นการนำไลบรารี BLAS และ ATLAS LAPACK ไปใช้
  • ประสิทธิภาพของพีชคณิตเชิงเส้นนั้นรวดเร็วมากเมื่อเทียบกับ BLAS และ LAPACK
  • รูทีนพีชคณิตเชิงเส้นยอมรับออบเจ็กต์อาร์เรย์สองมิติและเอาต์พุตก็เป็นอาร์เรย์สองมิติเช่นกัน

ตอนนี้เรามาทำแบบทดสอบกัน scipy.linalg,

คิดเลข ปัจจัย ของเมทริกซ์สองมิติ

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 )

Output: -7.0

เมทริกซ์ผกผัน –

scipy.linalg.inv()

Inverse Matrix ของ Scipy คำนวณค่าผกผันของเมทริกซ์จตุรัสใดๆ

มาดูกัน,

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 )

Output:

array( [[-0.28571429,  0.71428571],
       [ 0.42857143, -0.57142857]] )

ค่าลักษณะเฉพาะและเวกเตอร์ลักษณะเฉพาะ

scipy.linalg.eig()

  • ปัญหาที่พบบ่อยที่สุดในพีชคณิตเชิงเส้นคือค่าลักษณะเฉพาะและเวกเตอร์ลักษณะเฉพาะ ซึ่งสามารถแก้ไขได้ง่ายโดยใช้ อีไอจี()ฟังก์ชัน
  • ตอนนี้ให้เราค้นหาค่าลักษณะเฉพาะของ (X) และสอดคล้องกับเวกเตอร์ลักษณะเฉพาะของเมทริกซ์จตุรัสสองมิติ

ตัวอย่าง

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)

Output:

[ 9.+0.j -1.+0.j] #eigenvalues
 [ [ 0.70710678 -0.5547002 ] #eigenvectors
   [ 0.70710678  0.83205029] ]

การแปลงฟูริเยร์แบบไม่ต่อเนื่อง – scipy.fftpack

  • DFT เป็นเทคนิคทางคณิตศาสตร์ที่ใช้ในการแปลงข้อมูลเชิงพื้นที่เป็นข้อมูลความถี่
  • FFT (Fast Fourier Transformation) เป็นอัลกอริทึมสำหรับการคำนวณ DFT
  • FFT ถูกนำไปใช้กับอาร์เรย์หลายมิติ
  • ความถี่เป็นตัวกำหนดจำนวนสัญญาณหรือความยาวคลื่นในช่วงเวลาใดเวลาหนึ่ง

ตัวอย่าง: คลื่นและแสดงโดยใช้ไลบรารี Matplotlib เราใช้ตัวอย่างฟังก์ชันคาบง่ายๆ ของ 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()

Output:

การแปลงฟูเรียร์แบบไม่ต่อเนื่อง

คุณสามารถเห็นสิ่งนี้ ความถี่คือ 5 Hz และสัญญาณจะทำซ้ำใน 1/5 วินาที ซึ่งเรียกว่าเป็นช่วงเวลาหนึ่ง

ตอนนี้ให้เราใช้คลื่นไซน์ซอยด์นี้ด้วยความช่วยเหลือของแอปพลิเคชัน 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()

Output:

การแปลงฟูเรียร์แบบไม่ต่อเนื่อง

  • คุณสามารถเห็นได้อย่างชัดเจนว่าเอาต์พุตนั้นเป็นอาร์เรย์หนึ่งมิติ
  • อินพุตที่มีค่าเชิงซ้อนจะเป็นศูนย์ ยกเว้นสองจุด
  • ในตัวอย่าง DFT เราเห็นภาพขนาดของสัญญาณ

การเพิ่มประสิทธิภาพและความเหมาะสมใน SciPy – scipy.optimize

  • การเพิ่มประสิทธิภาพเป็นอัลกอริธึมที่มีประโยชน์สำหรับการลดขนาดเส้นโค้ง การปรับหลายมิติหรือสเกลาร์ และการปรับรูตให้เหลือน้อยที่สุด
  • ลองมาตัวอย่างของ ฟังก์ชันสเกลาร์เพื่อหาฟังก์ชันสเกลาร์ขั้นต่ำ
%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) 

Output:

การเพิ่มประสิทธิภาพและความพอดีใน SciPy

สิ้นสุดการเพิ่มประสิทธิภาพเรียบร้อยแล้ว

ค่าฟังก์ชันปัจจุบัน: -23.241676

การวนซ้ำ: 4

การประเมินฟังก์ชัน: 18

การประเมินการไล่ระดับสี: 6

อาร์เรย์ ([-1.67096375])

  • ในตัวอย่างนี้ การปรับให้เหมาะสมเสร็จสิ้นด้วยความช่วยเหลือของอัลกอริธึมการไล่ระดับสีจากจุดเริ่มต้น
  • แต่ปัญหาที่เป็นไปได้คือค่าต่ำสุดในท้องถิ่นแทนที่จะเป็นค่าต่ำสุดทั่วโลก หากเราไม่พบเพื่อนบ้านของ global minima เราก็จำเป็นต้องใช้ global Optimization และค้นหาฟังก์ชัน global minima ที่ใช้เป็น อ่างล้างหน้า() ซึ่งรวมเครื่องมือเพิ่มประสิทธิภาพท้องถิ่นไว้ด้วยกัน

ปรับให้เหมาะสม basinhopping (ฟังก์ชัน, 0)

Output:

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])

อัลกอริทึม Nelder –Mead:

  • อัลกอริธึม Nelder-Mead เลือกผ่านพารามิเตอร์วิธีการ
  • เป็นแนวทางที่ตรงไปตรงมาที่สุดในการลดบทบาทหน้าที่ประพฤติตนอย่างยุติธรรม
  • อัลกอริธึม Nelder – Mead ไม่ได้ใช้สำหรับการประเมินการไล่ระดับสี เนื่องจากอาจใช้เวลานานกว่าในการค้นหาวิธีแก้ไข
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")

Output:

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])

การประมวลผลภาพด้วย SciPy – scipy.ndimage

  • scipy.ndimage เป็นซับโมดูลของ SciPy ซึ่งส่วนใหญ่ใช้สำหรับการดำเนินการที่เกี่ยวข้องกับรูปภาพ
  • ndimage หมายถึง รูปภาพที่มีมิติ “n”
  • การประมวลผลภาพ SciPy ให้การแปลงทางเรขาคณิต (หมุน ครอบตัด พลิก) การกรองภาพ (คมชัดและจมูก) แสดงภาพ การแบ่งส่วนภาพ การจัดหมวดหมู่ และการแยกคุณสมบัติ
  • แพ็คเกจ MISC ใน SciPy มีรูปภาพที่สร้างไว้ล่วงหน้าซึ่งสามารถใช้เพื่อดำเนินการจัดการรูปภาพได้

ตัวอย่าง: ลองใช้ตัวอย่างการแปลงทางเรขาคณิตของรูปภาพกัน

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()

Output:

การประมวลผลภาพด้วย SciPy

ตอนนี้เรา พลิกลง ภาพปัจจุบัน:

#Flip Down using scipy misc.face image  
flip_down = np.flipud(misc.face())
plt.imshow(flip_down)
plt.show()

Output:

การประมวลผลภาพด้วย SciPy

ตัวอย่าง: การหมุนภาพโดยใช้ 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()

Output:

การประมวลผลภาพด้วย SciPy

บูรณาการกับ Scipy - บูรณาการเชิงตัวเลข

  • เมื่อเรารวมฟังก์ชันใดๆ ที่ไม่สามารถรวมเข้าด้วยกันเชิงวิเคราะห์ได้ เราจำเป็นต้องหันมาใช้การรวมเชิงตัวเลข
  • SciPy มีฟังก์ชันการทำงานเพื่อรวมฟังก์ชันเข้ากับการรวมเชิงตัวเลข
  • scipy.บูรณาการ ไลบรารีมีการอินทิเกรตเดี่ยว, สองครั้ง, สาม, หลาย, เกาส์เซียนกำลังสอง, รอมเบิร์ก, สี่เหลี่ยมคางหมู และกฎของซิมป์สัน

ตัวอย่าง: ทีนี้ลองยกตัวอย่าง บูรณาการเดี่ยว

บูรณาการกับ Scipy

Here a คือขีดจำกัดบนและ b คือขีดจำกัดล่าง

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)

Output:

(0.33333333333333337, 3.700743415417189e-15)

ฟังก์ชันนี้ส่งคืนค่าสองค่า โดยค่าแรกคือการรวมเข้าด้วยกัน และค่าที่สองคือข้อผิดพลาดโดยประมาณในปริพันธ์

ตัวอย่าง: ตอนนี้ใช้ตัวอย่าง SciPy ของ การบูรณาการแบบสองทาง เราพบการอินทิเกรตแบบคู่ของสมการต่อไปนี้

บูรณาการกับ 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)

Output:

(3.0, 9.657432734515774e-14)

คุณคงเห็นว่าผลลัพธ์ข้างต้นเหมือนกับผลลัพธ์ก่อนหน้า

สรุป

  • SciPy (ออกเสียงว่า “Sigh Pi”) เป็นโอเพ่นซอร์ส Python- ห้องสมุดที่ใช้ในด้านคณิตศาสตร์ คอมพิวเตอร์เชิงวิทยาศาสตร์ วิศวกรรมศาสตร์ และคอมพิวเตอร์เชิงเทคนิค
  • SciPy มีแพ็คเกจย่อยที่หลากหลายซึ่งช่วยในการแก้ไขปัญหาทั่วไปที่เกี่ยวข้องกับการคำนวณทางวิทยาศาสตร์
  • SciPy ถูกสร้างขึ้นบน NumPy
ชื่อแพคเกจ Descriptไอออน
scipy.io ไฟล์อินพุต/เอาท์พุต
เผ็ด.พิเศษ ฟังก์ชั่นพิเศษ
scipy.linalg พีชคณิตเชิงเส้น Operaการ
scipy.สอดแทรก การแก้ไข
scipy.เพิ่มประสิทธิภาพ การเพิ่มประสิทธิภาพและความเหมาะสม
scipy.stats สถิติและตัวเลขสุ่ม
scipy.บูรณาการ การรวมตัวเลข
scipy.fftpack การแปลงฟูเรียร์แบบเร็ว
scipy.สัญญาณ Signal กระบวนการผลิต
scipy.ndimage การจัดการภาพ –