ไซปีเข้าแล้ว Python บทช่วยสอน: คืออะไร ไลบรารี ฟังก์ชั่น และตัวอย่าง
ไซปีเข้าแล้ว Python
ไซปีเข้าแล้ว Python เป็นห้องสมุดโอเพ่นซอร์สที่ใช้สำหรับการแก้ปัญหาทางคณิตศาสตร์ วิทยาศาสตร์ วิศวกรรมศาสตร์ และทางเทคนิค ช่วยให้ผู้ใช้สามารถจัดการข้อมูลและแสดงภาพข้อมูลโดยใช้ระดับสูงที่หลากหลาย Python คำสั่ง SciPy ถูกสร้างขึ้นบน Python ส่วนขยาย NumPy SciPy ยังออกเสียงว่า "Sigh Pi"
แพ็คเกจย่อยของ SciPy:
- ไฟล์อินพุต/เอาต์พุต – scipy.io
- ฟังก์ชั่นพิเศษ – เผ็ด.พิเศษ
- พีชคณิตเชิงเส้น Operaความคิด – scipy.linalg
- การแก้ไข – scipy.สอดแทรก
- การเพิ่มประสิทธิภาพและความเหมาะสม – scipy.เพิ่มประสิทธิภาพ
- สถิติและตัวเลขสุ่ม – scipy.stats
- บูรณาการเชิงตัวเลข – scipy.บูรณาการ
- การแปลงฟูเรียร์แบบเร็ว – scipy.fftpack
- Signal กำลังประมวลผล - scipy.สัญญาณ
- การจัดการภาพ – scipy.ndimage
ทำไมต้องใช้ 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:
สิ้นสุดการเพิ่มประสิทธิภาพเรียบร้อยแล้ว
ค่าฟังก์ชันปัจจุบัน: -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:
ตอนนี้เรา พลิกลง ภาพปัจจุบัน:
#Flip Down using scipy misc.face image flip_down = np.flipud(misc.face()) plt.imshow(flip_down) plt.show()
Output:
ตัวอย่าง: การหมุนภาพโดยใช้ 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.บูรณาการ ไลบรารีมีการอินทิเกรตเดี่ยว, สองครั้ง, สาม, หลาย, เกาส์เซียนกำลังสอง, รอมเบิร์ก, สี่เหลี่ยมคางหมู และกฎของซิมป์สัน
ตัวอย่าง: ทีนี้ลองยกตัวอย่าง บูรณาการเดี่ยว
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 ของ การบูรณาการแบบสองทาง เราพบการอินทิเกรตแบบคู่ของสมการต่อไปนี้
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 | การจัดการภาพ – |