SciPy в Python Підручник: що таке, бібліотека, функції та приклади

SciPy в Python

SciPy в Python це бібліотека з відкритим кодом, яка використовується для вирішення математичних, наукових, інженерних і технічних задач. Це дозволяє користувачам маніпулювати даними та візуалізувати дані, використовуючи широкий діапазон високого рівня Python команди. SciPy побудовано на Python Розширення NumPy. SciPy також вимовляється як «Сих Пі».

Підпакети SciPy:

Навіщо використовувати 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) 

вихід:

Оптимізація та підгонка в SciPy

Оптимізацію завершено.

Поточне значення функції: -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()

вихід:

Обробка зображень за допомогою SciPy

Зараз ми Відкидний поточне зображення:

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

вихід:

Обробка зображень за допомогою 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()

вихід:

Обробка зображень за допомогою SciPy

Інтеграція з Scipy – числова інтеграція

  • Коли ми інтегруємо будь-яку функцію, де аналітичне інтегрування неможливо, нам потрібно звернутися до чисельного інтегрування
  • SciPy надає функціональність для інтеграції функції з числовим інтегруванням.
  • scipy.integrate Бібліотека має одиночне інтегрування, подвійне, потрійне, кратне, квадрат Гауса, правила Ромберга, трапеції та правила Сімпсона.

приклад: Тепер візьміть приклад Єдина інтеграція

Інтеграція з Scipy

тут 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 подвійна інтеграція. Ми знаходимо подвійне інтегрування наступного рівняння,

Інтеграція з 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 Маніпуляції зображеннями –