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:

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:

Transformada Discreta de Fourier

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:

Transformada Discreta de Fourier

  • 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:

Otimização e ajuste no SciPy

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:

Processamento de imagem com SciPy

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:

Processamento de imagem com SciPy

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:

Processamento de imagem com SciPy

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

Integração com Scipy

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,

Integração com 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)

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 –