SciPy em Python Tutorial: O que é, Biblioteca, Função e Exemplos
SciPy em Python
SciPy em Python é uma biblioteca de código aberto usada para resolver problemas matemáticos, científicos, de engenharia e técnicos. Ele permite aos usuários manipular os dados e visualizá-los usando uma ampla gama de recursos de alto nível. Python comandos. SciPy é construído sobre o Python Extensão NumPy. SciPy também é pronunciado como “Sigh Pi”.
Subpacotes do SciPy:
- Entrada/saída de arquivo – scipy.io
- Função especial - scipy.especial
- Álgebra Linear Operação – scipy.linalg
- Interpolação – scipy.interpolar
- Otimização e ajuste – scipy.otimizar
- Estatísticas e números aleatórios – scipy.stats
- Integração numérica - scipy.integrate
- Transformadas rápidas de Fourier – pacote scipy.fft
- Signal Processamento – scipy.signal
- Manipulação de imagem – scipy.ndiimagem
Por que usar o SciPy
- SciPy contém variedades de subpacotes que ajudam a resolver os problemas mais comuns relacionados à Computação Científica.
- Pacote SciPy em Python é a biblioteca científica mais usada, atrás apenas da Biblioteca Científica GNU para C/C++ ou Matlab.
- Fácil de usar e entender, bem como poder computacional rápido.
- Ele pode operar em uma variedade de bibliotecas NumPy.
Numpy versus SciPy
Numpy
- Numpy é escrito em C e usado para cálculos matemáticos ou numéricos.
- É mais rápido que outros Python bibliotecas
- Numpy é a biblioteca mais útil para Data Science realizar cálculos básicos.
- Numpy contém nada além do tipo de dados array que executa as operações mais básicas, como classificação, modelagem, indexação, etc.
SciPy
- SciPy é construído em cima do NumPy
- Módulo SciPy em Python é uma versão completa da Álgebra Linear, enquanto o Numpy contém apenas alguns recursos.
- A maioria dos novos recursos de ciência de dados estão disponíveis no Scipy, e não no Numpy.
SciPy – Instalação e configuração do ambiente
Você também pode instalar o SciPy em Windows via pip
Python3 -m pip install --user numpy scipy
Instale o Scipy no Linux
sudo apt-get install python-scipy python-numpy
Instale o SciPy no Mac
sudo port install py35-scipy py35-numpy
Antes de começarmos a aprender SciPy Python, você precisa conhecer a funcionalidade básica, bem como os diferentes tipos de uma matriz de NumPy
A maneira padrão de importar módulos SciPy e Numpy:
from scipy import special #same for other modules import numpy as np
Pacote de entrada/saída de arquivo
Scipy, pacote I/O, possui uma ampla gama de funções para trabalhar com diversos formatos de arquivos que são Matlab, Arff, Wave, Matrix Market, IDL, NetCDF, TXT, CSV e formato binário.
Vamos pegar um formato de arquivo Python Exemplo SciPy que é usado regularmente no 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']
Saída:
array([[ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.], [ 1., 1., 1., 1.]])
Explicação do código
- Linha 1 e 2: Importe a biblioteca SciPy essencial em Python com pacote de E/S e Numpy.
- Linha 3: Crie um array dimensional 4 x 4
- Linha 4: Armazena a matriz em exemplo.mat arquivo.
- Linha 5: Obtenha dados de exemplo.mat lima
- Linha 6: Imprimir saída.
Pacote de funções especiais
- scipy.especial O pacote contém inúmeras funções da física matemática.
- A função especial SciPy inclui raiz cúbica, exponencial, soma logarítmica exponencial, Lambert, permutação e combinações, gama, Bessel, hipergeométrico, Kelvin, beta, cilindro parabólico, erro relativo exponencial, etc.
- Para uma descrição de uma linha de todas essas funções, digite Python console:
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.
Função raiz cúbica
A função raiz cúbica encontra a raiz cúbica dos valores.
Sintaxe:
scipy.special.cbrt(x)
Exemplo:
from scipy.special import cbrt #Find cubic root of 27 & 64 using cbrt() function cb = cbrt([27, 64]) #print value of cb print(cb)
Saída: matriz([3., 4.])
Função exponencial:
A função exponencial calcula 10**x elemento a elemento.
Exemplo:
from scipy.special import exp10 #define exp10 function and pass value in its exp = exp10([1,10]) print(exp)
Saída: [1.e+01 1.e+10]
Permutações e combinações
SciPy também oferece funcionalidade para calcular permutações e combinações.
Combinações - scipy.special.comb(N,k)
Exemplo:
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)
Saída: 15.0
Permutações –
scipy.special.perm(N,k)
Exemplo:
from scipy.special import perm #find permutation of 5, 2 using perm (N, k) function per = perm(5, 2, exact = True) print(per)
Saída: 20
Função exponencial de soma de log
Log Sum Exponential calcula o log do elemento de entrada sum exponencial.
Sintaxe:
scipy.special.logsumexp(x)
Função Bessel
Função de cálculo de ordem de número inteiro
Sintaxe:
scipy.special.jn()
Álgebra Linear com SciPy
- Álgebra Linear do SciPy é uma implementação das bibliotecas BLAS e ATLAS LAPACK.
- O desempenho da Álgebra Linear é muito rápido em comparação com BLAS e LAPACK.
- A rotina de álgebra linear aceita objetos de matriz bidimensional e a saída também é uma matriz bidimensional.
Agora vamos fazer alguns testes com scipy.linalg,
Calculando determinante de uma matriz bidimensional,
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 )
Saída: -7.0
Matriz Inversa –
scipy.linalg.inv()
Matriz Inversa do Scipy calcula o inverso de qualquer matriz quadrada.
Vamos ver,
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 )
Saída:
array( [[-0.28571429, 0.71428571], [ 0.42857143, -0.57142857]] )
Autovalores e autovetores
scipy.linalg.eig()
- O problema mais comum em álgebra linear são os autovalores e os autovetores, que podem ser facilmente resolvidos usando eig()função.
- Agora vamos encontrar o autovalor de (X) e correspondem ao autovetor de uma matriz quadrada bidimensional.
Exemplo
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)
Saída:
[ 9.+0.j -1.+0.j] #eigenvalues [ [ 0.70710678 -0.5547002 ] #eigenvectors [ 0.70710678 0.83205029] ]
Transformada Discreta de Fourier – scipy.fftpack
- DFT é uma técnica matemática usada na conversão de dados espaciais em dados de frequência.
- FFT (Fast Fourier Transformation) é um algoritmo para calcular DFT
- FFT é aplicado a uma matriz multidimensional.
- A frequência define o número de sinal ou comprimento de onda em um determinado período de tempo.
Exemplo: Faça uma onda e mostre usando a biblioteca Matplotlib. tomamos um exemplo de função periódica simples de 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()
Saída:
Você pode ver isso. A frequência é de 5 Hz e seu sinal se repete em 1/5 de segundo – é chamado em um determinado período de tempo.
Agora vamos usar esta onda senoidal com a ajuda da aplicação 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()
Saída:
- Você pode ver claramente que a saída é uma matriz unidimensional.
- A entrada contendo valores complexos é zero, exceto dois pontos.
- No exemplo DFT visualizamos a magnitude do sinal.
Otimização e ajuste no SciPy – scipy.optimize
- A otimização fornece um algoritmo útil para minimização de ajuste de curva, multidimensional ou escalar e ajuste de raiz.
- Vamos dar um exemplo de uma função escalar,para encontrar a função escalar mínima.
%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)
Saída:
A otimização foi encerrada com sucesso.
Valor da função atual: -23.241676
Iterações: 4
Avaliações de função: 18
Avaliações de gradiente: 6
matriz([-1.67096375])
- Neste exemplo, a otimização é feita com a ajuda do algoritmo de descida gradiente a partir do ponto inicial
- Mas a possível questão são os mínimos locais em vez dos mínimos globais. Se não encontrarmos um vizinho dos mínimos globais, então precisamos aplicar a otimização global e encontrar a função de mínimos globais usada como baciahopping() que combina otimizador local.
otimizar.basinhopping(função, 0)
Saída:
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])
Algoritmo Nelder-Mead:
- O algoritmo Nelder-Mead seleciona através do parâmetro do método.
- Ele fornece a maneira mais direta de minimização para uma função de comportamento justo.
- O algoritmo Nelder – Mead não é usado para avaliações de gradiente porque pode levar mais tempo para encontrar a solução.
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")
Saída:
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])
Processamento de imagem com SciPy – scipy.ndimage
- scipy.ndimage é um submódulo do SciPy que é usado principalmente para realizar uma operação relacionada a imagens
- ndimage significa a imagem “n” dimensional.
- O SciPy Image Processing fornece transformação geométrica (girar, cortar, inverter), filtragem de imagens (nítido e de nariz), exibição de imagem, segmentação de imagem, classificação e extração de recursos.
- Pacote MISC no SciPy contém imagens pré-construídas que podem ser usadas para realizar tarefas de manipulação de imagens
Exemplo: Vamos dar um exemplo de transformação geométrica de imagens
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()
Saída:
Agora nós Virado para baixo imagem atual:
#Flip Down using scipy misc.face image flip_down = np.flipud(misc.face()) plt.imshow(flip_down) plt.show()
Saída:
Exemplo: Rotação de imagem usando 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()
Saída:
Integração com Scipy – Integração Numérica
- Quando integramos qualquer função onde a integração analiticamente não é possível, precisamos recorrer à integração numérica
- SciPy fornece funcionalidade para integrar funções com integração numérica.
- scipy.integrate a biblioteca possui regras de integração simples, dupla, tripla, múltipla, quadrática gaussiana, Romberg, trapezoidal e Simpson.
Exemplo: Agora tome um exemplo de Integração Única
Aqui você encontra a é o limite superior e b é o limite inferior
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)
Saída:
(0.33333333333333337, 3.700743415417189e-15)
Aqui a função retorna dois valores, nos quais o primeiro valor é a integração e o segundo valor é o erro estimado na integral.
Exemplo: agora pegue um exemplo SciPy de dupla integração. Encontramos a dupla integração da seguinte equação,
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)
Saída:
(3.0, 9.657432734515774e-14)
Você viu a saída acima como a mesma anterior.
Resumo
- SciPy (pronuncia-se “Sigh Pi”) é um software de código aberto PythonBiblioteca baseada em , que é usada em matemática, computação científica, engenharia e computação técnica.
- SciPy contém variedades de subpacotes que ajudam a resolver os problemas mais comuns relacionados à Computação Científica.
- SciPy é construído em cima do NumPy
Nome do pacote | Descrição |
---|---|
scipy.io | Entrada/saída de arquivo |
scipy.especial | Função especial |
scipy.linalg | Álgebra Linear Operação |
scipy.interpolar | Interpolação |
scipy.otimizar | Otimização e ajuste |
scipy.stats | Estatísticas e números aleatórios |
scipy.integrate | Integração numérica |
pacote scipy.fft | Transformadas rápidas de Fourier |
scipy.signal | Signal Tratamento |
scipy.ndiimagem | Manipulação de imagem – |