SciPy в Python Підручник: що таке, бібліотека, функції та приклади
SciPy в Python
SciPy в Python це бібліотека з відкритим кодом, яка використовується для вирішення математичних, наукових, інженерних і технічних задач. Це дозволяє користувачам маніпулювати даними та візуалізувати дані, використовуючи широкий діапазон високого рівня Python команди. SciPy побудовано на Python Розширення NumPy. SciPy також вимовляється як «Сих Пі».
Підпакети SciPy:
- Введення/виведення файлу – scipy.io
- Спеціальна функція – scipy.special
- Лінійна алгебра Operaція – scipy.linalg
- Інтерполяція – scipy.interpolate
- Оптимізація та підгонка – scipy.optimize
- Статистика та випадкові числа – scipy.stats
- Числове інтегрування – scipy.integrate
- Швидке перетворення Фур'є – scipy.fftpack
- Signal Обробка – scipy.signal
- Маніпуляції зображеннями – scipy.ndimage
Навіщо використовувати SciPy
- SciPy містить різноманітні підпакети, які допомагають вирішити найпоширеніші проблеми, пов’язані з науковими обчисленнями.
- Пакет SciPy в Python є найбільш використовуваною науковою бібліотекою, поступаючись лише науковій бібліотеці GNU для C/C++ або Matlab.
- Простий у використанні та розумінні, а також швидка обчислювальна потужність.
- Він може працювати з масивом бібліотеки NumPy.
Numpy VS SciPy
Пустотливий
- Numpy написаний на C і використовується для математичних або числових обчислень.
- Це швидше, ніж інші Python Бібліотеки
- Numpy — це найкорисніша бібліотека для Data Science для виконання базових обчислень.
- Numpy містить лише тип даних масиву, який виконує найпростіші операції, такі як сортування, формування, індексування тощо.
SciPy
- SciPy вбудовано в NumPy
- Модуль SciPy в Python — це повнофункціональна версія лінійної алгебри, тоді як 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, вам потрібно знати основні функції, а також різні типи масиву numpy
Стандартний спосіб імпорту модулів 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']
вихід:
array([[ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.]])
Пояснення коду
- Рядок 1 і 2: Імпортуйте основну бібліотеку SciPy Python з пакетом введення/виведення та Numpy.
- Лінія 3: Створення масиву розміром 4 x 4
- Лінія 4: зберігати масив у приклад.мат файлу.
- Лінія 5: Отримати дані з приклад.мат файл
- Лінія 6: вихід на друк.
Пакет спеціальних функцій
- scipy.special Пакет містить численні функції математичної фізики.
- Спеціальна функція 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)
вихід: масив ([3., 4.])
Експоненціальна функція:
Експоненціальна функція обчислює 10**x поелементно.
приклад:
from scipy.special import exp10 #define exp10 function and pass value in its exp = exp10([1,10]) print(exp)
вихід: [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)
вихід: 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)
вихід: 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 )
вихід: -7.0
Обернена матриця –
scipy.linalg.inv()
Обернена матриця 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 )
вихід:
array( [[-0.28571429, 0.71428571], [ 0.42857143, -0.57142857]] )
Власні значення та власний вектор
scipy.linalg.eig()
- Найпоширенішою проблемою лінійної алгебри є власні значення та власний вектор, які можна легко розв’язати за допомогою 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)
вихід:
[ 9.+0.j -1.+0.j] #eigenvalues [ [ 0.70710678 -0.5547002 ] #eigenvectors [ 0.70710678 0.83205029] ]
Дискретне перетворення Фур’є – scipy.fftpack
- DFT — це математичний метод, який використовується для перетворення просторових даних у частотні.
- ШПФ (швидке перетворення Фур’є) — це алгоритм для обчислення ДПФ
- ШПФ застосовується до багатовимірного масиву.
- Частота визначає кількість сигналу або довжину хвилі в певний період часу.
приклад: Візьміть хвилю та покажіть, використовуючи бібліотеку 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()
вихід:
Ви можете це побачити. Частота становить 5 Гц, а його сигнал повторюється через 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()
вихід:
- Ви можете чітко бачити, що вихід є одновимірним масивом.
- Вхідні дані, що містять комплексні значення, дорівнюють нулю, крім двох точок.
- У прикладі 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)
вихід:
Оптимізацію завершено.
Поточне значення функції: -23.241676
Ітерації: 4
Оцінки функцій: 18
Градієнтні оцінки: 6
масив ([-1.67096375])
- У цьому прикладі оптимізація виконується за допомогою алгоритму градієнтного спуску з початкової точки
- Але можливою проблемою є локальні мінімуми замість глобальних мінімумів. Якщо ми не знайдемо сусіда глобальних мінімумів, тоді нам потрібно застосувати глобальну оптимізацію та знайти функцію глобальних мінімумів, яка використовується як basinhopping() який поєднує локальний оптимізатор.
optimize.basinhopping(функція, 0)
вихід:
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])
Алгоритм Нелдера – Міда:
- Алгоритм Нелдера-Міда вибирає через параметр методу.
- Він забезпечує найпростіший спосіб мінімізації для нормальної функції.
- Алгоритм Нелдера – Міда не використовується для оцінки градієнта, оскільки пошук рішення може зайняти більше часу.
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")
вихід:
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 забезпечує перетворення геометричних параметрів (обертання, обрізання, відображення), фільтрацію зображень (різкість і деформація), відображення зображення, сегментацію зображення, класифікацію та виділення функцій.
- Пакет РІЗНЕ у 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()
вихід:
Зараз ми Відкидний поточне зображення:
#Flip Down using scipy misc.face image flip_down = np.flipud(misc.face()) plt.imshow(flip_down) plt.show()
вихід:
приклад: Обертання зображення за допомогою 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()
вихід:
Інтеграція з Scipy – числова інтеграція
- Коли ми інтегруємо будь-яку функцію, де аналітичне інтегрування неможливо, нам потрібно звернутися до чисельного інтегрування
- SciPy надає функціональність для інтеграції функції з числовим інтегруванням.
- scipy.integrate Бібліотека має одиночне інтегрування, подвійне, потрійне, кратне, квадрат Гауса, правила Ромберга, трапеції та правила Сімпсона.
приклад: Тепер візьміть приклад Єдина інтеграція
тут 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)
вихід:
(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)
вихід:
(3.0, 9.657432734515774e-14)
Ви бачили, що вище виведено, як і попередній.
Підсумки
- SciPy (вимовляється як «Sigh Pi») є відкритим вихідним кодом Pythonбібліотека на основі, яка використовується в математиці, наукових обчисленнях, інженерії та технічних обчисленнях.
- SciPy містить різноманітні підпакети, які допомагають вирішити найпоширеніші проблеми, пов’язані з науковими обчисленнями.
- SciPy вбудовано в NumPy
Ім'я пакета | Опис |
---|---|
scipy.io | Введення/виведення файлу |
scipy.special | Спеціальна функція |
scipy.linalg | Лінійна алгебра Operaції |
scipy.interpolate | Інтерполяція |
scipy.optimize | Оптимізація та підгонка |
scipy.stats | Статистика та випадкові числа |
scipy.integrate | Числове інтегрування |
scipy.fftpack | Швидке перетворення Фур'є |
scipy.signal | Signal Обробка |
scipy.ndimage | Маніпуляції зображеннями – |