Saltar al contenido

Tutorial de Python SciPy: Aprender con el ejemplo

diciembre 8, 2019

¿Qué es SciPy?

SciPy es una biblioteca de código abierto basada en Python, que se utiliza en matemáticas, computación científica, ingeniería y computación técnica.

SciPy también se pronuncia «Sigh Pi».

Subpaquetes de SciPy:

  • Archivo de entrada/salida – scipy.io
  • Función especial – scipy.special
  • Operación de álgebra lineal – scipy.linalg
  • Interpolación – scipy.interpolate
  • Optimización y ajuste – scipy.optimize
  • Estadísticas y números aleatorios – scipy.stats
  • Integración numérica – scipy.integrate
  • Transformaciones rápidas de Fourier – scipy.fftpack
  • Procesamiento de señales – scipy.signal
  • Manipulación de imágenes – scipy.ndimage

En este tutorial, aprenderá:

  • ¿Qué es SciPy?
  • Por qué usar SciPy
  • Numpy VS SciPy
  • SciPy – Instalación y configuración del entorno
  • Paquete de entrada y salida de archivos:
  • Paquete de funciones especiales:
  • Álgebra lineal con SciPy:
  • Transformada discreta de Fourier – scipy.fftpack
  • Optimización y ajuste en SciPy – scipy.optimize
  • Nelder – Algoritmo Mead:
  • Procesamiento de imágenes con SciPy – scipy.ndimage

Por qué usar SciPy

  • SciPy contiene variedades de subpaquetes que ayudan a resolver el problema más común relacionado con la Computación Científica.
  • SciPy es la biblioteca científica más utilizada, sólo superada por la Biblioteca Científica de GNU para C/C++ o Matlab.
  • Fácil de usar y entender, así como rápida potencia computacional.
  • Puede funcionar con una serie de librerías NumPy.

Numpy VS SciPy

Numpy:

  • Numpy se escribe en C y se utiliza para el cálculo matemático o numérico.
  • Es más rápido que otras librerías Python
  • Numpy es la biblioteca más útil para que Data Science realice cálculos básicos.
  • Numpy no contiene más que datos de tipo array que realizan las operaciones más básicas como ordenar, modelar, indexar, etc.

SciPy:

  • SciPy está construido en la parte superior del NumPy
  • SciPy es una versión completa de Álgebra lineal, mientras que Numpy contiene sólo unas pocas características.
  • La mayoría de las nuevas funciones de Data Science están disponibles en Scipy y no en Numpy.

SciPy – Instalación y configuración del entorno

También puede instalar SciPy en Windows a través de pip

Python3 -m pip install –user numpy scipy
>

Instalar Scipy en Linux

sudo apt-get install python-scipy python-numpy
>

Instalar SciPy en Mac

sudo port install py35-scipy py35-numpy

>

Antes de comenzar a aprender SciPy, necesita conocer la funcionalidad básica, así como los diferentes tipos de una matriz de NumPy

La forma estándar de importar módulos infSciPy y Numpy:

desde scipy import especial #same para otros módulos
import numpy as np

>

Paquete de entrada y salida de archivos:

Scipy, paquete I/O, tiene una amplia gama de funciones para trabajar con diferentes formatos de archivos que son Matlab, Arff, Wave, Matrix Market, IDL, NetCDF, TXT, CSV y formato binario.

Tomemos un ejemplo de formato de archivo como el que se utiliza regularmente en MatLab:

import numpy as np
de scipy import io as sio
array = np.ones((4, 4))
sio.savemat($0027ejemplo.mat$0027, {$0027ar$0027: array})
data = sio.loadmat($0027ejemplo.mat$0027, struct_as_record=True)
datos[$0027array$0027]
>

Salida:

array([[[[ 1., 1., 1., 1., 1.],
           [ 1., 1., 1., 1.],
           [ 1., 1., 1., 1.],
           [ 1., 1., 1., 1.]])

>

Código Explicación

  • Línea 1 y 2: Importa la biblioteca esencial scipy con el paquete i/o y Numpy.
  • Línea 3 : Crear una matriz 4 x 4, dimensional
  • Línea 4 : Almacenar la matriz en el archivo example.mat .
  • Línea 5: Obtener datos del archivo example.mat
  • Línea 6 : Salida de impresión.

Paquete de funciones especiales

  • scipy.special contiene numerosas funciones de física matemática.
  • La función especial de SciPy incluye Raíz Cúbica, Exponencial, Log sum Exponencial, Lambert, Permutación y Combinaciones, Gamma, Bessel, hipergeométrico, Kelvin, beta, cilindro parabólico, Exponencial de Error Relativo, etc…
  • Para una descripción de línea de todas estas funciones, escriba en la consola Python:
ayuda(scipy.special)	
Salida
NOMBRE
    scipy.especial
DESCRIPCIÓN
    ========================================
    Funciones especiales (:mod:`scipy.special`)
    ========================================
    ... módulo:: scipy.special
    Casi todas las funciones que se indican a continuación son funciones universales y son las siguientes
    y las reglas automáticas de colocación en bucle de las matrices. Se anotan las excepciones.

>

Función raíz cúbica:

La función Raíz cúbica encuentra la raíz cúbica de los valores.

Sintaxis:

scipy.special.cbrt(x)
>

Ejemplo:

de scipy.special import cbrt
#Find cubic root of 27 & 64 using cbrt() function
cb = cbrt([27, 64])
#valor de impresión de cb
imprimir(cb)

>

Salida: array([3., 4.])

Función exponencial:

La función exponencial calcula el valor de 10**x del elemento.

Ejemplo:

de scipy.special import exp10
#define la función exp10 y pasa el valor en su
exp = exp10([1,10])
imprimir(exp)
>

Salida: 1.e+01 1.e+10]

Permutaciones y combinaciones:

SciPy también proporciona funcionalidad para calcular Permutaciones y Combinaciones.

Combinaciones – scipy.special.comb(N,k )

Ejemplo:

de scipy.special import comb
#encontrar combinaciones de 5, 2 valores usando comb(N, k)
com = peine(5, 2, exacto = Falso, repetición = Verdadero)
print(com)

>

Salida: 15,0

Permutaciones –

scipy.special.perm(N,k)
>

Ejemplo:

de scipy.special import perm
#encontrar permutación de 5, 2 usando la función perm (N, k)
per = perm(5, 2, exacto = Verdadero)
imprimir(por)

>

Salida: 20

Función exponencial de suma de registro

Log Sum Exponential calcula el log del elemento de entrada suma exponencial.

Sintaxis :

scipy.special.logsumexp(x)

>

Función de Bessel

Función de cálculo del orden de enésimo entero

Sintaxis :

scipy.special.jn()
>

Álgebra lineal con SciPy

  • Álgebra Lineal de SciPy es una implementación de las bibliotecas BLAS y ATLAS LAPACK.
  • El rendimiento de Álgebra Lineal es muy rápido comparado con BLAS y LAPACK.
  • La rutina de álgebra lineal acepta objetos de matriz bidimensional y la salida es también una matriz bidimensional.

Ahora vamos a hacer algunas pruebas con scipy.linalg,

Cálculo determinante de una matriz bidimensional,

de la importación de scipy linalg
import numpy as np
#definir matriz cuadrada
two_d_array = np.array([[4,5],[3,2] ])
#pase los valores a la función det()
linalg.det( two_d_array)

>

Salida: -7,0

Matriz inversa –

scipy.linalg.inv()

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.

La Matriz Inversa de Scipy calcula la inversa de cualquier matriz cuadrada.

Veamos,

de la importación de scipy linalg
import numpy as np
# definir una matriz cuadrada
two_d_array = np.array([[4,5],[3,2] ])
#pasar valor a la función inv()
linalg.inv( two_d_array)

>

Salida:

array( [[-0.28571429, 0.71428571],
       [ 0.42857143, -0.57142857]] )

>

Valores propios y Eigenvector – scipy.linalg.eig()

  • El problema más común en el álgebra lineal son los autovalores y el autovector que pueden resolverse fácilmente usando la función eig() .
  • Ahora vamos a encontrar el valor propio de ( X ) y el correspondiente vector propio de una matriz cuadrada bidimensional.

Ejemplo,

de la importación de scipy linalg
import numpy as np
#definir una matriz bidimensional
arr = np.array([[5,4],[6,3]])
#Pase el valor a la función
eg_val, eg_vect = linalg.eig(arr)
#get eigenvalues
print(eg_val)
#get eigenvectors
imprimir(eg_vect)

>

Salida:

[ 9.+0.j -1.+0.j] #eigenvalues
0.70710678 -0.5547002 ] #eigenvectores
[ 0.70710678 0.83205029] ]
>

Transformada discreta de Fourier – scipy.fftpack

  • El DFT es una técnica matemática que se utiliza para convertir datos espaciales en datos de frecuencia.
  • FFT (Fast Fourier Transformation) es un algoritmo para calcular DFT
  • FFT se aplica a una matriz multidimensional.
  • La frecuencia define el número de señal o de longitud de onda en un período de tiempo determinado.

Ejemplo: Tome una ola y muéstrela usando la librería Matplotlib. Tomamos un ejemplo de función periódica simple de sin(20 × 2πt)

%matplotlib inline
desde matplotlib importar pyplot como plt
import numpy as np
#Frecuencia en términos de Hertz
fre = 5
#Velocidad de muestreo
fre_samp = 50
t = np.linspace(0, 2, 2 * fre_samp, endpoint = False)
a = np.sin(fre * 2 * np.pi * t)
figura, eje = plt.subplots()
axis.plot(t, a)
axis.set_xlabel ($0027Tiempo (s)$0027)
axis.set_ylabel ($0027Amplitud de la señal$0027)
plt.show()
>

Salida :

Puedes ver esto. La frecuencia es de 5 Hz y su señal se repite en 1/5 de segundo – su llamada como un período de tiempo particular.

Ahora usemos esta onda sinusoidal con la ayuda de la aplicación DFT.

de scipy import fftpack
A = fftpack.fft(a)
frecuencia = fftpack.fftfreq(len(a)) * fre_samp
figura, eje = plt.subplots()
vástago del eje (frecuencia, np.abs(A))
axis.set_xlabel($0027Frecuencia en Hz$0027)
axis.set_ylabel($0027Magnitud del espectro de frecuencias$0027)
axis.set_xlim(-fre_samp / 2, fre_samp/ 2)
axis.set_ylim(-5, 110)
plt.show()
>

Salida:

  • Se puede ver claramente que la salida es un array unidimensional.
  • Las entradas que contienen valores complejos son cero excepto dos puntos.
  • En el ejemplo de DFT visualizamos la magnitud de la señal.

Optimización y ajuste en SciPy – scipy.optimize

  • La optimización proporciona un algoritmo útil para minimizar el ajuste curvo, multidimensional o escalar y el ajuste radicular.
  • Tomemos un ejemplo de una función escalar, para encontrar la función escalar mínima .

%matplotlib inline
importar matplotlib.pyplot como plt
de la importación de scipy optimizar
import numpy as np
def función(a):
devolver a*2 + 20 * np.sin(a)
plt.plot(a, función(a))
plt.show()
#Usar el algoritmo BFGS para la optimización
optimize.fmin_bfgs(función, 0)
>

Salida:

La optimización ha finalizado con éxito.

Valor actual de la función: -23.241676

Iteraciones: 4

Evaluaciones de funciones: 18

Evaluaciones de gradiente: 6

array([-1.6709696375])

  • En este ejemplo, la optimización se realiza con la ayuda del algoritmo de descenso del gradiente desde el punto inicial
  • .

  • Pero el posible problema son los mínimos locales en lugar de los mínimos globales. Si no encontramos un vecino de los mínimos globales, entonces necesitamos aplicar la optimización global y encontrar la función de mínimos globales usada como basinhopping() que combina el optimizador local.

optimizar.basinhopping(función, 0)

Salida:

fun: -23.241676238045315
resultado_de_la_optimización_más_baja:
diversión: -23.24167623808045315
hess_inv: array([[0.05023331]])
jac: array([4.76837158e-07])
mensaje: La optimización ha terminado con éxito.
nfev: 15
liendre: 3
njev: 5
estado: 0
éxito: Verdadero
x: matriz ([-1.67096375])
mensaje: [$0027número solicitado de iteraciones de salto de cuenca completadas con éxito$0027]
fallos_de_minimización: 0
nfev: 1530
liendre: 100
njev: 510
x: matriz ([-1.67096375])
>

Nelder – Algoritmo Mead:

  • El algoritmo Nelder-Mead selecciona a través del parámetro de método.
  • Proporciona la forma más sencilla de minimizar la función de comportamiento justo.
  • Nelder – El algoritmo Mead no se utiliza para las evaluaciones de gradiente porque puede llevar más tiempo encontrar la solución.
import numpy as np
de scipy.optimize importar minimizar
#definir función f(x)
def f(x):
    devolver .4*(1 - x[0])**2
optimize.minimize(f,[2, -1], method="Nelder-Mead")

>

Salida:

final_simplex: (array([[ 1. , -1.27109375],
       [ 1. , -1.27118835],
       [ 1. , -1.27113762]]), array([0., 0., 0., 0.]))
           divertido: 0.0
       mensaje: La optimización ha terminado con éxito.
          nfev: 147
           liendre: 69
        estado: 0
       éxito: Verdadero
             x: matriz ([ 1. , -1.27109375])

>

Procesamiento de imágenes con SciPy – scipy.ndimage

  • scipy.ndimage es un submódulo de SciPy que se utiliza principalmente para realizar una operación relacionada con imágenes
  • ndimage significa la imagen «n» dimensional.
  • El Procesamiento de Imágenes de SciPy proporciona transformación geométrica (rotar, recortar, voltear), filtrado de imágenes (nítidas y de nariz), visualización de imágenes, segmentación de imágenes, clasificación y extracción de características.
  • El paquete MISC en SciPy contiene imágenes prediseñadas que pueden utilizarse para realizar tareas de manipulación de imágenes

Ejemplo: Tomemos un ejemplo de transformación geométrica de imágenes

de importación de scipy misc
desde matplotlib importar pyplot como plt
import numpy as np
#get face image of panda from misc package
panda = misc.face()
#graficar o mostrar la imagen de la cara
plt.imshow( panda)
plt.show()
>

Salida:

Ahora Flip-down imagen actual:

#Flip Down usando la imagen de Scipy misc.face
flip_down = np.flipud(misc.face())
plt.imshow(flip_down)
plt.show()
>

Salida:

Ejemplo : Rotación de la imagen usando Scipy,

de la importación de ndimage de scipy, misc
desde matplotlib importar pyplot como plt
panda = misc.face()
#función de rotación de scipy para la imagen - imagen girada 135 grados
panda_rotate = ndimage.rotate(panda, 135)
plt.imshow(panda_rotate)
plt.show()

>

Salida:

Integración con Scipy – Integración numérica

  • Cuando integramos cualquier función en la que no es posible la integración analítica, tenemos que recurrir a la integración numérica
  • .

  • SciPy proporciona funcionalidad para integrar la función con la integración numérica.
  • scipy.integrate tiene reglas de integración simple, doble, triple, múltiple, cuadrado gaussiano, Romberg, Trapezoidal y Simpson.

Ejemplo: Ahora tomemos un ejemplo de Integración única

Aquí a es el límite superior y b es el límite inferior

de importación de scipy integrate
# tomar la función f(x) como f
f = lambda x : x**2
#integración única con a = 0 y b = 1
integración = integrate.quad(f, 0 , 1)
imprimir(integración)
>

Salida:

(0.333333333333333333337, 3.700743415417189e-15)

Aquí la función devuelve dos valores, en los cuales el primer valor es integración y el segundo valor es error estimado en integral.

Ejemplo: Ahora tomemos un ejemplo de doble integración. Encontramos la doble integración de la siguiente ecuación,

de importación de scipy integrate
import numpy as np
#importar función raíz cuadrada desde math lib
desde importación matemática sqrt
# set fuction f(x)
f = lambda x, y : 64 *x*y
# límite inferior de la segunda integral
p = lambda x : 0
# límite superior de la primera integral
q = lambda y : sqrt(1 – 2*y**2)
# realizar una doble integración
integración = integrate.dblquad(f, 0 , 2/4, p, q)
imprimir(integración)
>

Salida:

(3.0, 9.657432734515774e-14)

Usted ha visto que por encima de la salida como el mismo anterior.

Resumen

  • SciPy(pronunciado como «Sigh Pi») es una biblioteca de código abierto basada en Python, que se utiliza en matemáticas, computación científica, ingeniería y computación técnica.
  • SciPy contiene variedades de subpaquetes que ayudan a resolver el problema más común relacionado con la Computación Científica.
  • SciPy está construido en la parte superior del NumPy

Nombre del paquete Descripción scipy.io

  • Entrada/salida de archivos

scipy.especial

  • Función especial

scipy.linalg

  • Operación de álgebra lineal

interpolación.scipy

  • Interpolación

scipy.optimize

  • Optimización y ajuste

scipy.stats

  • Estadísticas y números aleatorios

scipy.integrate

  • Integración numérica

scipy.fftpack

  • Transformaciones rápidas de Fourier

señal.scipy

  • Procesamiento de señales

scipy.ndimage

  • Manipulación de imágenes –