SciPy em Python: Tutorial Completo sobre Bibliotecas e Funções
SciPy em Python: Tutorial Completo sobre Bibliotecas e Funções
SciPy em Python
SciPy é uma biblioteca open-source que estende o NumPy para fornecer ferramentas para resolver problemas matemáticos, científicos, de engenharia e técnicos. Construída sobre o NumPy, a SciPy oferece um amplo conjunto de comandos de alto nível para manipulação e visualização de dados.
Sub-pacotes
- scipy.io – I/O de arquivos para MATLAB, NetCDF, CSV e muitos outros formatos
- scipy.special – Funções matemáticas especiais (Bessel, Gamma, etc.)
- scipy.linalg – Rotinas de álgebra linear
- scipy.interpolate – Técnicas de interpolação
- scipy.optimize – Otimização e ajuste de curvas
- scipy.stats – Distribuições estatísticas e geração de números aleatórios
- scipy.integrate – Integração numérica
- scipy.fftpack – Transformadas rápidas de Fourier
- scipy.signal – Processamento de sinais
- scipy.ndimage – Processamento de imagem multi-dimensional
Este tutorial cobre:
- O que é SciPy e por que importa
- Diferenças entre NumPy e SciPy
- Instalação e configuração de ambiente
- Principais sub-pacotes com exemplos de código
- Aplicações práticas: álgebra linear, transformadas de Fourier, otimização, processamento de imagem e integração numérica
Por que Usar SciPy?
- Conjunto abrangente de ferramentas científicas, segundo apenas a bibliotecas como GNU Scientific Library e MATLAB
- Fácil de usar, rápido e totalmente compatível com arrays NumPy
- Amplamente adotado na academia e indústria, garantindo suporte robusto e contribuições da comunidade
NumPy vs. SciPy
NumPy
- Biblioteca central para computação numérica de alta performance em Python, escrita em C
- Fornece objetos array e operações básicas (ordenamento, remodelagem, indexação)
- Fundação para todas as bibliotecas científicas em Python
SciPy
- Construída sobre o NumPy, estendendo-o com algoritmos especializados
- Inclui suítes completas de álgebra linear, otimização, estatísticas e mais
- Essencial para fluxos de trabalho científicos avançados
Instalação e Configuração de Ambiente
Instale SciPy com pip ou gerenciadores de pacote do sistema:
Python3 -m pip install --user numpy scipy
sudo apt-get install python-scipy python-numpy
sudo port install py35-scipy py35-numpy
Importe SciPy e NumPy em seus scripts:
from scipy import special import numpy as np
I/O de Arquivos com scipy.io
Salve e carregue arquivos MATLAB .mat facilmente:
import numpy as np
from scipy import io as sio
array = np.ones((4, 4))
sio.savemat('exemplo.mat', {'ar': array})
carregado = sio.loadmat('exemplo.mat', struct_as_record=True)
print(carregado['ar'])
Saída:
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
Funções Especiais – scipy.special
Exemplos de funções especiais comumente usadas:
- Raiz cúbica:
scipy.special.cbrt(x)→cbrt([27, 64]) # [3., 4.] - 10x:
scipy.special.exp10(x)→exp10([1,10]) # [1.e+01 1.e+10] - Combinações:
scipy.special.comb(N, k, exact=False, repetition=True)→comb(5, 2) # 15.0 - Permutações:
scipy.special.perm(N, k, exact=True)→perm(5, 2) # 20 - LogSumExp:
scipy.special.logsumexp(x) - Bessel J:
scipy.special.jn(n, x)
Álgebra Linear – scipy.linalg
Calcule determinante, inversa, autovalores e autovetores:
from scipy import linalg import numpy as np A = np.array([[4,5],[3,2]]) print(linalg.det(A)) # -7.0 print(linalg.inv(A)) # matriz inversa autovalores, autovetores = linalg.eig(A) print(autovalores) print(autovetores)
Saída:
-7.0
array([[-0.28571429, 0.71428571],
[ 0.42857143, -0.57142857]])
[ 9.+0.j -1.+0.j]
[[ 0.70710678 -0.5547002 ]
[ 0.70710678 0.83205029]]
Transformada Discreta de Fourier – scipy.fftpack
Transforme uma senoide e visualize seu espectro:
%matplotlib inline
from matplotlib import pyplot as plt
import numpy as np
from scipy import fftpack
freq = 5
sample_rate = 50
t = np.linspace(0, 2, 2 * sample_rate, endpoint=False)
wave = np.sin(freq * 2 * np.pi * t)
plt.plot(t, wave)
plt.xlabel('Tempo (s)'); plt.ylabel('Amplitude')
plt.show()
A = fftpack.fft(wave)
frequencia = fftpack.fftfreq(len(wave)) * sample_rate
plt.stem(frequencia, np.abs(A))
plt.xlabel('Frequência (Hz)')
plt.ylabel('Magnitude')
plt.xlim(-sample_rate/2, sample_rate/2)
plt.ylim(0, 110)
plt.show()
Otimização – scipy.optimize
Encontre o mínimo de uma função escalar usando BFGS e busca global com basin-hopping:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize
def func(a):
return a*2 + 20*np.sin(a)
plt.plot(np.linspace(-10, 10, 400), func(np.linspace(-10, 10, 400)))
plt.show()
min_bfgs = optimize.fmin_bfgs(func, 0)
print('Resultado BFGS:', min_bfgs)
min_basin = optimize.basinhopping(func, 0)
print('Resultado Basin-hopping:', min_basin.x)
A saída mostra o mínimo local encontrado por BFGS e o ótimo global confirmado por basin-hopping.
Algoritmo Nelder-Mead
Minimização simples sem restrições sem informação de gradiente:
from scipy.optimize import minimize
def f(x):
return 0.4*(1 - x[0])**2
res = minimize(f, [2, -1], method='Nelder-Mead')
print('Resultado:', res.x, 'Valor da função:', res.fun)
Processamento de Imagem – scipy.ndimage
Manipule imagens: exibir, inverter, rotacionar e aplicar filtros.
from scipy import ndimage, misc
from matplotlib import pyplot as plt
panda = misc.face()
plt.imshow(panda)
plt.title('Original')
plt.show()
flip_down = np.flipud(panda)
plt.imshow(flip_down)
plt.title('Invertido Verticalmente')
plt.show()
rotacionado = ndimage.rotate(panda, 135)
plt.imshow(rotacionado)
plt.title('Rotacionado 135°')
plt.show()
Integração Numérica – scipy.integrate
Integrais simples e duplas com estimativa automática de erro:
from scipy import integrate
# Integral simples de x^2 de 0 a 1
simples = integrate.quad(lambda x: x**2, 0, 1)
print('Integral simples:', simples)
# Integral dupla de 64*x*y sobre domínio triangular
dupla = integrate.dblquad(lambda x, y: 64*x*y, 0, 2/4,
lambda x: 0, lambda y: (1 - 2*y**2)**0.5)
print('Integral dupla:', dupla)
Ambas retornam tupla: (valor, erro estimado).
Resumo
SciPy estende NumPy para fornecer uma stack completa de computação científica, incluindo álgebra linear, otimização, estatísticas, processamento de sinal e manipulação de imagem. Seus extensos sub-pacotes e suporte robusto da comunidade tornam-no indispensável para pesquisadores e engenheiros.
| Nome do Pacote | Descrição |
|---|---|
| scipy.io | I/O de arquivos para MATLAB, CSV, NetCDF, etc. |
| scipy.special | Funções matemáticas especiais (Bessel, Gamma, etc.) |
| scipy.linalg | Rotinas avançadas de álgebra linear |
| scipy.interpolate | Métodos de interpolação |
| scipy.optimize | Ferramentas de otimização e ajuste de curvas |
| scipy.stats | Distribuições estatísticas & geração de números aleatórios |
| scipy.integrate | Integração numérica (quad, dblquad, etc.) |
| scipy.fftpack | Transformadas rápidas de Fourier |
| scipy.signal | Utilitários de processamento de sinal |
| scipy.ndimage | Processamento de imagem multi-dimensional |
python
- Função Print() do Python: Guia Prático com Exemplos
- Domine o str.count() do Python: Como Contar Caracteres e Substrings com Exemplos
- Domine Strings format() em Python com Exemplos Claros
- Dominando Funções Lambda em Python: Exemplos Práticos e Boas Práticas
- Função abs() em Python: Calcular Valores Absolutos para Números e Complexos
- Função round() em Python Explicada com Exemplos Práticos
- Dominando a Função map() do Python: Sintaxe, Exemplos e Boas Práticas
- Python timeit(): Medindo Tempo de Execução com Exemplos Práticos
- Dominando o yield do Python: Generator vs Return – Guia Prático
- Entendendo type() e isinstance() em Python: Exemplos Práticos