SciPy в Python Урок: Какво е, библиотека, функция и примери

SciPy в Python

SciPy в Python е библиотека с отворен код, използвана за решаване на математически, научни, инженерни и технически проблеми. Тя позволява на потребителите да манипулират данните и да визуализират данните, използвайки широк диапазон от високо ниво Python команди. SciPy е изграден върху Python Разширение NumPy. SciPy също се произнася като „Sigh Pi“.

Подпакети на SciPy:

Защо да използвате SciPy

  • SciPy съдържа различни подпакети, които помагат за решаването на най-често срещания проблем, свързан с научните изчисления.
  • SciPy пакет в Python е най-използваната научна библиотека, на второ място след GNU Scientific Library за C/C++ или на Matlab.
  • Лесен за използване и разбиране, както и бърза изчислителна мощност.
  • Може да работи с масив от библиотека NumPy.

Numpy VS SciPy

numpy

  • 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 с I/O пакет и Numpy.
  • Line 3: Създайте 4 x 4, размерен масив
  • Line 4: Съхранявайте масива в пример.мат файл.
  • Ред 5: Вземете данни от пример.мат досие
  • Line 6: Изход за печат.

Пакет със специални функции

  • scipy.специален Пакетът съдържа множество функции на математическата физика.
  • Специалната функция на 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 е математическа техника, която се използва за преобразуване на пространствени данни в честотни данни.
  • FFT (бърза трансформация на Фурие) е алгоритъм за изчисляване на 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()

Изход:

Дискретно преобразуване на Фурие

Можете да видите това. Честотата е 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()

Изход:

Дискретно преобразуване на Фурие

  • Можете ясно да видите, че изходът е едномерен масив.
  • Входните данни, съдържащи комплексни стойности, са нула с изключение на две точки.
  • В примера за DFT визуализираме величината на сигнала.

Оптимизация и Fit в 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) 

Изход:

Оптимизация и Fit в 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])

Алгоритъм на 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")

Изход:

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 Image Processing осигурява геометрична трансформация (завъртане, изрязване, преобръщане), филтриране на изображения (рязко и изместване), изображение на дисплея, сегментиране на изображение, класификация и извличане на функции.
  • РАЗНИ пакет в 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)

Видяхте горния изход като същия предишен.

Oбобщение

  • SciPy (произнася се като „Sigh Pi“) е с отворен код Python-базирана библиотека, която се използва в математиката, научните изчисления, инженерството и техническите изчисления.
  • SciPy съдържа различни подпакети, които помагат за решаването на най-често срещания проблем, свързан с научните изчисления.
  • SciPy е вграден в горната част на NumPy
Име на пакета Descriptйон
scipy.io Файлов вход/изход
scipy.специален Специална функция
scipy.linalg Линейна алгебра OperaАЦИ
scipy.interpolate интерполация
scipy.optimize Оптимизация и прилягане
scipy.stats Статистика и произволни числа
scipy.integrate Числено интегриране
scipy.fftpack Бързи трансформации на Фурие
scipy.сигнал Signal Обработване
scipy.ndimage Манипулиране на изображения –