SciPy en Python: Tutorial completo sobre librerías y funciones
SciPy en Python: Tutorial completo sobre librerías y funciones
SciPy en Python
SciPy es una librería de código abierto que extiende NumPy para proporcionar herramientas para resolver problemas matemáticos, científicos, de ingeniería y técnicos. Construida sobre NumPy, SciPy ofrece un amplio conjunto de comandos de alto nivel para manipulación y visualización de datos.
Sub-paquetes
- scipy.io – Entrada/salida de archivos para MATLAB, NetCDF, CSV y muchos otros formatos
- scipy.special – Funciones matemáticas especiales (Bessel, Gamma, etc.)
- scipy.linalg – Rutinas de álgebra lineal
- scipy.interpolate – Técnicas de interpolación
- scipy.optimize – Optimización y ajuste de curvas
- scipy.stats – Distribuciones estadísticas y generación de números aleatorios
- scipy.integrate – Integración numérica
- scipy.fftpack – Transformadas rápidas de Fourier
- scipy.signal – Procesamiento de señales
- scipy.ndimage – Procesamiento de imágenes multidimensionales
Este tutorial cubre:
- Qué es SciPy y por qué importa
- Diferencias entre NumPy y SciPy
- Instalación y configuración del entorno
- Sub-paquetes clave con ejemplos de código
- Aplicaciones prácticas: álgebra lineal, transformadas de Fourier, optimización, procesamiento de imágenes e integración numérica
Por qué usar SciPy
- Conjunto completo de herramientas científicas, solo superado por librerías como GNU Scientific Library y MATLAB
- Fácil de usar, rápido y totalmente compatible con arrays de NumPy
- Ampliamente adoptado en academia e industria, asegurando soporte robusto y contribuciones de la comunidad
NumPy vs. SciPy
NumPy
- Librería central para computación numérica de alto rendimiento en Python, escrita en C
- Proporciona objetos array y operaciones básicas (ordenación, remodelación, indexación)
- Fundación para todas las librerías científicas en Python
SciPy
- Construida sobre NumPy, extendiéndola con algoritmos especializados
- Incluye suites completas de álgebra lineal, optimización, estadísticas y más
- Esencial para flujos de trabajo científicos avanzados
Instalación y configuración del entorno
Instala SciPy con pip o gestores de paquetes del sistema:
Python3 -m pip install --user numpy scipy
sudo apt-get install python-scipy python-numpy
sudo port install py35-scipy py35-numpy
Importa SciPy y NumPy en tus scripts:
from scipy import special import numpy as np
Entrada/Salida de archivos con scipy.io
Guarda y carga archivos MATLAB .mat fácilmente:
import numpy as np
from scipy import io as sio
array = np.ones((4, 4))
sio.savemat('ejemplo.mat', {'ar': array})
cargado = sio.loadmat('ejemplo.mat', struct_as_record=True)
print(cargado['ar'])
Salida:
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
Funciones especiales – scipy.special
Ejemplos de funciones especiales comúnmente usadas:
- Raíz 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] - Combinaciones:
scipy.special.comb(N, k, exact=False, repetition=True)→comb(5, 2) # 15.0 - Permutaciones:
scipy.special.perm(N, k, exact=True)→perm(5, 2) # 20 - LogSumExp:
scipy.special.logsumexp(x) - Bessel J:
scipy.special.jn(n, x)
Álgebra lineal – scipy.linalg
Calcula determinante, inversa, valores y vectores propios:
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 vals, vecs = linalg.eig(A) print(vals) print(vecs)
Salida:
-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
Transforma una sinusoide y visualiza su 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('Tiempo (s)'); plt.ylabel('Amplitud')
plt.show()
A = fftpack.fft(wave)
frequency = fftpack.fftfreq(len(wave)) * sample_rate
plt.stem(frequency, np.abs(A))
plt.xlabel('Frecuencia (Hz)')
plt.ylabel('Magnitud')
plt.xlim(-sample_rate/2, sample_rate/2)
plt.ylim(0, 110)
plt.show()
Optimización – scipy.optimize
Encuentra el mínimo de una función escalar usando BFGS y búsqueda global con 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)
La salida muestra el mínimo local encontrado por BFGS y el óptimo global confirmado por basin-hopping.
Algoritmo Nelder-Mead
Minimización simple sin restricciones sin información 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 función:', res.fun)
Procesamiento de imágenes – scipy.ndimage
Manipula imágenes: mostrar, voltear, rotar y 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('Volteado abajo')
plt.show()
rotated = ndimage.rotate(panda, 135)
plt.imshow(rotated)
plt.title('Rotado 135°')
plt.show()
Integración numérica – scipy.integrate
Integrales simples y dobles con estimación automática de error:
from scipy import integrate
# Integral simple de x^2 de 0 a 1
simple = integrate.quad(lambda x: x**2, 0, 1)
print('Integral simple:', simple)
# Integral doble de 64*x*y sobre dominio triangular
doble = integrate.dblquad(lambda x, y: 64*x*y, 0, 2/4, lambda x: 0, lambda y: (1 - 2*y**2)**0.5)
print('Integral doble:', doble)
Ambas devuelven una tupla: (valor, error estimado).
Resumen
SciPy extiende NumPy para proporcionar una pila completa de computación científica, incluyendo álgebra lineal, optimización, estadísticas, procesamiento de señales y manipulación de imágenes. Sus extensos sub-paquetes y robusto soporte comunitario la hacen indispensable para investigadores e ingenieros.
| Nombre del Paquete | Descripción |
|---|---|
| scipy.io | Entrada/salida de archivos para MATLAB, CSV, NetCDF, etc. |
| scipy.special | Funciones matemáticas especiales (Bessel, Gamma, etc.) |
| scipy.linalg | Rutinas avanzadas de álgebra lineal |
| scipy.interpolate | Métodos de interpolación |
| scipy.optimize | Herramientas de optimización y ajuste de curvas |
| scipy.stats | Distribuciones estadísticas y generación de números aleatorios |
| scipy.integrate | Integración numérica (quad, dblquad, etc.) |
| scipy.fftpack | Transformadas rápidas de Fourier |
| scipy.signal | Utilidades de procesamiento de señales |
| scipy.ndimage | Procesamiento de imágenes multidimensionales |
python
- Función print() en Python: Guía Práctica con Ejemplos
- Domine str.count() en Python: Cómo Contar Caracteres y Subcadenas con Ejemplos
- Domine el Formateo de Strings en Python con format(): Ejemplos Claros
- Domine el Método String.find() en Python: Sintaxis, Ejemplos y Alternativas
- Dominando las funciones lambda en Python: ejemplos prácticos y mejores prácticas
- Función abs() en Python: calcular valores absolutos para números y complejos
- Función round() en Python explicada con ejemplos prácticos
- Dominando la función map() de Python: sintaxis, ejemplos y mejores prácticas
- Python timeit(): medición de tiempo de ejecución con ejemplos prácticos
- Dominando yield en Python: Generadores vs Return – Guía práctica
- Entendiendo type() e isinstance() en Python: ejemplos prácticos