SciPy в Python Урок: Какво е, библиотека, функция и примери
SciPy в Python
SciPy в Python е библиотека с отворен код, използвана за решаване на математически, научни, инженерни и технически проблеми. Тя позволява на потребителите да манипулират данните и да визуализират данните, използвайки широк диапазон от високо ниво Python команди. SciPy е изграден върху Python Разширение NumPy. SciPy също се произнася като „Sigh Pi“.
Подпакети на SciPy:
- Вход/изход на файл – scipy.io
- Специална функция – scipy.специален
- Линейна алгебра Operaция – scipy.linalg
- Интерполация – scipy.interpolate
- Оптимизация и прилягане – scipy.optimize
- Статистика и произволни числа – scipy.stats
- Числено интегриране – scipy.integrate
- Бързи трансформации на Фурие – scipy.fftpack
- Signal Обработка – scipy.сигнал
- Манипулиране на изображения – scipy.ndimage
Защо да използвате 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)
Изход:
Оптимизацията приключи успешно.
Текуща стойност на функцията: -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()
Изход:
Сега ние Обръщане надолу текущо изображение:
#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)
Видяхте горния изход като същия предишен.
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 | Манипулиране на изображения – |