17 de mayo de 2016

42. "Matematicando" y "Supermatematicando"

"Matematicando"

Módulo MATH
El módulo math provee matemáticas de punto flotante, igual que la biblioteca C subyacente a Python.
Funciones: acos, acosh, asin, asinh, atan, atan2, atanh, ceil, copysign, cos, cosh, degrees, e, erf, erfc, exp, expm1, fabs, factorial, floor, fmod, frexp, fsum, gamma, hypot, isinf, isnan, ldexp, lgamma, log, log10, log1p, modf, pi, pow, radians, sin, sinh, sqrt, tan, tanh, trunc.
Aunque algunas son evidentes, es mejor echarles un vistazo en la documentación del módulo math.
# -*- coding: utf-8 -*-

import math

numberpi = 4 * math.atan(1)

t = True
while t:
    try:
        x = float(raw_input("Dime un ángulo entre 0 y 360: "))
        t = False
    except Exception, ex:
        print "Error " + str(ex)
    
angrad = x * numberpi / 180
print "En radianes: ", angrad, "rad"
print "Coseno del ángulo: ",math.cos(angrad)
print "Seno del ángulo: ",math.sin(angrad)    
print "Tangente del ángulo: ",math.tan(angrad)    
= = =
Módulo CMATH
El módulo cmath se usa con matemáticas de números complejos. Documentación de cmath
# -*- coding: utf-8 -*-

import math, cmath

numberpi = cmath.pi
print numberpi

# representamos un número complejo
z = 4 + 5 * 1j

# Expresiones complejas que NO DEPENDEN de cmath
print "Número complejo: ", z
print "Parte real: ", z.real
print "Parte imaginaria: ", z.real

# Expresiones de cálculo de números complejos
print "Representación polar: ", cmath.polar(z)
print "Fase: ", cmath.phase(z)
print "Raíz cuadrada: ", cmath.sqrt(z)
= = =
módulo STATISTICS
Como su nombre indica, es un módulo con funciones de cálculo estadístico. Sus funciones / clases / métodos son: Decimal, Fraction, StatisticsError, __all__, __builtins__, __doc__, __file__, __name__, __package__, __path__, _check_type, _counts, _decimal_to_ratio, _exact_ratio, _ss, _sum, collections, division, math, mean, median, median_grouped, median_high, median_low, mode, pstdev, pvariance, stdev, variance.
Si no está instalado por defecto, os recuerdo que con el procedimiento desde una terminal de root: pip install statistics se puede cargar el módulo.
# -*- coding: utf-8 -*-

import random, statistics as st

# lista de números al azar 
numeros = random.sample(range(0,400),100)

print "Listado: ",numeros

# print st.mean.__doc__
print "Media de la lista: ", st.mean(numeros)
print "Varianza: ", st.variance(numeros)
print "Mediana: ", st.median(numeros)
= = =
Otros módulos matemáticos y científicos: http://scipy.org/ , https://wiki.python.org/moin/NumericAndScientific

"Super-matematicando"

Módulo NUMPY
El módulo numpy (si no lo tenemos podemos instalar apt-get install python-numpy) lo usamos con vectores y matrices, realizando cálculos matemáticos de alto nivel.
El principal objeto de numpy es un array multidimensional, cuyos elementos en principio son de mismo tipo. Cada dimension del array se llama ejes (axes) y el número de ejes es el rango.
[1, 2, 3] es un array de rango 1, de longitud 3
[ (1,3,4) , (5,6,7)] es un array de rango 2, cuyos elementos tienen una longitud 3
La clase correspondiente al array usado por numpy se llama ndarray, aunque su alias es array; numpy.array no es el mismo que array.array, la clase estándar de python.
Un ejemplo de los atributos del array de numpy.
# -*- coding: utf-8 -*-

import numpy as np

def mostrar(a):
    print "\n",a
    print "Rango del array: ", a.ndim
    print "Tamaño del array en cada dimensión: ", a.shape
    print "Número total de elementos: ", a.size
    print "Tipos de elementos:", a.dtype.name
    print "Tamaño en bytes: ", a.itemsize
    print "Buffer: ", a.data

a = np.array([1,2,3])
mostrar(a)

a = np.array([[1,2,3], [4,2,4]], dtype=float)
mostrar(a)

a = np.array([[1,2,2.0], [4,0.2,4], [3,0.2,1.4]])
mostrar(a)

# a = np.array(1,2,3,4)  #¡Cuidado! No poner corchetes lanza un error
= = =
Con la siguiente instrucción podemos definir explícitamente el tipo de datos usados por el array
c = np.array( [ [1,2], [3,4] ], dtype=float )
= = =
  • Las funciones np.zeros, np.ones y np.empty crea arrays de n ejes y longitud m.  La primera rellena con ceros, la segunda con unos y la tercera de contenido aleatorio.
  • np.arange(0,20,1); crea un array de 20 elementos empezando en 0, contando de 1 en uno. Similar a la función conocida range.
  • np.arange(0,20,2); crea un array de 10 elementos empezando en 0, contando de 2 en dos
  • np.arange(0,20,0.3); crea un array de elementos empezando en 0, contando de 0.3 en 0.3 y acaba en el número inmediatamente inferior al 20.
    • Debido a la naturaleza de los números float puede ser difícil de controlar el número de elementos de arrays construidos de esta forma.
  • np.linspace( 0, 2, 9 ); crea un array que contiene el 0 y el 2, y 7 elementos más equidistantes.
  • np.linspace( 0, 2*pi, 100); útil para generar 100 punto entre 0 y 2π
  • Para imprimir un array: a=np.linspace( 0, 2*pi, 100 )  print(a)
  • np.arange(10000).reshape(20, 500); crear un vector de 10000 elementos (longitud 10000 y rango 1) y "reformatearlo" en uno de rango 20 y 500 de longitud.
= = =
Operaciones con arrays
# -*- coding: utf-8 -*-

import numpy as np

a = np.linspace(0,9,4)
b = np.linspace(3,30,4)

print a
print b
# suma de arrays
print a + b
# resta de arrays
print a - b
# multiplicar por un factor y se le suma otra
print 3*a + 8
# elevar a un número
print a**3
# una función
print np.sin(10*a)
# comparación
print a<5
# multiplicar matrices, elemento a elemento
print a*b
#producto de matrices
print a.dot(b), np.dot(a,b)
= = =
Números aleatorios. Modificando un elemento del array
 -*- coding: utf-8 -*-

import numpy as np

a = np.random.random((2,3))

print a

a[0,1] = 10 * np.random.rand()

print a
= = =
Operaciones con arrays
# -*- coding: utf-8 -*-

import numpy as np

# matriz 3 x 4
a = np.arange(12).reshape(3,4)
print a, a.shape

#operaciones unitarias, elemento a elemento
print "Suma de todos los elementos: ",a.sum()
print "Mínimo de todos los elementos: ",a.min()
print "Máximo de todos los elementos: ",a.max()
print "Suma por cada columna: ",a.sum(axis=0)
# axis = 0 ==>  columnas, axis =1 ==> filas
print "Mínimo de cada fila: ",a.min(axis=1)
print "Suma acumulativa por filas: ", a.cumsum(axis=1)
# Funciones
print "Exponencial a cada número: ",np.exp(a)
print "Raíz cuadrada a cada número: ",np.sqrt(a)
= = =
Indexado, slicing e iteración sobre elementos de rango 1. Como listas en Python
# -*- coding: utf-8 -*-

import numpy as np

# matriz 3 x 4
a = np.arange(10) ** 3
print a

# Indexado de un elemento
print "En la posición 2 (3ª): ",a[2]
# Indexado 
print "De la 2 a la 4: ", a[2:5]
# De la posición 0, hasta la 6ª inclusive, rellenar con 1000 de dos en dos
a[:6:2]=1000
print "Asignando números de forma múltiple: ", a
# Al revés
a = a[::-1]
print "Al revés: ", a
= = =
Definida por función. Indexado y slicing en matrices
# -*- coding: utf-8 -*-

import numpy as np

def mifuncion(x,y):
    return 20*x-5*y

# matriz 3 x 4
a = np.fromfunction(mifuncion,(5,4),dtype=int)
print a

# Indexado de un eje o fila
print "En la posición 2 (3ª): ",a[2]
# Indexado de varias filas
print "De la 2 a la 4: ", a[2:5]
# Un sólo elemento
print "Elemento 2,3: ", a[2,3]
# lo que vale en cada fila la columna 2. Probar también a[:,1]
print "Columna nº 2: ", a[0:5,1]
print "Tres elementos de la 2ª fila: ",a[1,0:3]
print "Cada eje desde 2l 2º al 3º",a[1:3, : ]
print "La última fila: ",a[-1]
print "La penúltima fila: ",a[-2]
= = =
Iterando en una matriz. Por fila y por elemento
# -*- coding: utf-8 -*-

import numpy as np

def mifuncion(x,y):
    return 20*x-5*y

# matriz 3 x 4
a = np.fromfunction(mifuncion,(5,4),dtype=int)
print a

for row in a:
    print (row)

for element in a.flat:
    print (element)
= = =
NOTA: tampoco es el propósito de este curso ahondar en el álgebra vectorial, lo cual es capaz de hacer este módulo. Lo referimos por si lo necesitamos en alguno de nuestros programas. Dejo documentación para indagar más si nos hiciese falta.
Más documentación...
  1. Tutorial rápido de NUMPY
  2. Referencia de NUMPY
  3. Otro tutorial de NUMPY

No hay comentarios:

Publicar un comentario