Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Características
- Tipos dinámicos.
Significa que un objeto definido inicialmente de un determinado tipo,
puede cambiar durante la ejecución de un programa.
Por ejemplo, una variable escalar que inicialmente es tipo entero,
puede cambiar a tipo punto flotante, o a lógica o cadena de
caracteres en el transcurso de la ejecución.
Esto contrasta con lenguajes como C, C++ donde todas las variables,
constantes, objetos deben tener un tipo predefinido antes de ser
referenciadas y además no puede cambiar.
Aunque los tipos dinámicos pueden considerarse generalmente una
ventaja, dificultan la creación de un compilador para el lenguaje.
- Principalmente interpretado
Con frecuencia se dice que la principal realización de Python es
mediante un intérprete. Un intérprete es un programa que lee una
instrucción del programa fuente, la traduce a lenguaje máquina, la
ejecuta, lee la siguiente instrucción, etc.
En la actualidad pocos lenguajes se realizan estrictamente mediante
interpretación (Bash, AWK, sed, bc, cmd). En realidad, en Python,
JavaScript, PHP, Perl, Tcl, Ruby, Basic, R, Octave y otros lenguajes,
la principal realización es mixta: tienen una parte de compilación y
una parte de interpretación.
En el caso de Python, en una primera etapa todo el código fuente es
compilado a un lenguaje de "bytecodes" o lenguaje de máquina virtual,
el cual es independiente del hardware y del sistema operativo donde
eventualmente se ejecutará. Además, el código resultante ha pasado
una primera validación de sintaxis y dependencias.
El programa en código de máquina virtual permanece en memoria RAM y
entonces es interpretado (traducido) instrucción a instrucción a
código máquina, y ejecutado de inmediato. Sólo las instrucciones
bytecodes que es necesario ejecutar se traducen a lenguaje máquina.
El código compilado en bytecodes puede ser salvado en un archivo con
extensión .pyc, por lo que en la próxima ejecución del programa no
será necesaria la etapa de compilación.
- Versiones
Existen dos versiones principales de Python: hasta la versión 2.7 y
la 3.0 o mayor.
Las versiones menores que 3.0 no son mantenidas y deberían
desaparecer en el futuro; pero todavía hay paquetes y programas que
no han sido portados de la versión 2.7 a las versiones 3.
Descargas:
https://www.python.org/downloads/
Instalación en Windows
Python 3.4.0
Distribución Pyzo de Python:
http://www.pyzo.org/
Integra Python 3, Ipython, Anaconda y un IDE (IEP)
Configuración de Pyzo
6- Doble click sobre el ícono de Pyzo. Aparecerá un ambiente de
trabajo con 4 ventanas: el shell Ipython, el editor IEP, el navegador
de archivos y el árbol de funciones.
Se pueden abrir/cerrar otras ventanas en el menú con: Herramientas
(Tools)
Configurar el idioma:
Settings --> Select language --> Spanish --> OK
File --> Quit IEP
Volver a iniciar Pyzo
Configuración cónsola:
Cónsola --> Edita configuración cónsola --> exe:
C:\pyzo2015a\python.exe --> ipython: seleccionar la casilla -->
DirInicio: C:\Users\PC\Python --> Done
Configuración de colores:
Con un editor de texto como notepad, o el propio editor de Pyzo
abrir:
C:\pyzo2015a\Lib\site-packages\iep\codeeditor\base.py
grisobscuro = "#3C3C3C"
S = {}
S["Editor.text"] = "back: black, fore: YellowGreen"
S['Syntax.identifier'] = "fore: Peru, bold:no, italic:no,
underline:no"
S["Syntax.nonidentifier"] = "fore: blue, bold:no, italic:no,
underline:no"
S["Syntax.keyword"] = "fore: blue, bold:yes, italic:no, underline:no"
S["Syntax.functionname"] = "fore: Purple, bold:yes, italic:no,
underline:no"
S["Syntax.classname"] = "fore: magenta, bold:yes, italic:no,
underline:no"
S["Syntax.string"] = "fore: red, bold:no, italic:no, underline:no"
S["Syntax.unterminatedstring"] = "fore: red, bold:no, italic:no,
underline:dotted"
S["Syntax.python.multilinestring"] = "fore: red, bold:no, italic:no,
underline:no"
S["Syntax.number"] = "fore: dark orange, bold:no, italic:no,
underline:no"
S["Syntax.comment"] ="fore: green, bold:no, italic:yes, underline:no"
S["Syntax.todocomment"] = "fore: magenta, bold:no, italic:yes,
underline:no"
S["Syntax.python.cellcomment"] = "fore: green, bold:yes, italic:no,
underline:full"
S["Editor.Long line indicator"] = "linestyle:solid, fore: dark grey"
S["Editor.Highlight current line"] = "back: %s" % grisobscuro
S["Editor.Indentation guides"] = "linestyle:solid, fore: light grey"
S["Editor.Line numbers"] = "back: light grey, fore: black"
SPYDER
Es una alternativa a Pyzo, aunque puede ser conveniente instalar
primero Pyzo y después Spyder. Al igual que Pyzo, integra un ambiente
de programación con editor, shell, depurador, lista de objetos, etc.
Tiene un instalador para Windows.
https://github.com/spyder-ide/spyder
PyCharm edu
Ambiente de desarrollo para Python en Linux, Windows y OS X
https://www.jetbrains.com/pycharm-edu/
ERIC
Ambiente de desarrollo para Python en Windows y Linux
http://eric-ide.python-projects.org/
PYPE
Ambiente de desarrollo para Python en Windows y Linux. Conveniente
instalar primero Pyzo.
http://pype.sourceforge.net/index.shtml
1lI|
http://sourceforge.net/projects/dejavu/
Instalación:
Forma 1:
Seleccionar y hacer click botón derecho sobre los archivos con
extensión .ttf
En el menú aparecerá la opción instalar
--------------
Forma 2:
Panel de Control -->
Fonts (Dejar abierta esa ventana) -->
Desde un navegador de archivos seleccionar las fuentes DejaVu .ttf y
arrastrarlas a la ventana de fonts. Las instala automáticamente.
--------------
CONDA
Programa manejador de paquetes de Anaconda https://www.continuum.io/
Lista, busca, instala, actualiza, desinstala, etc, paquetes Python.
Viene con la distribución Pyzo.
Forma 1:
Abrir un terminal DOS
Ejecutar: C:\pyzo2015a\Scripts\conda.exe con los argumentos indicados
mas adelante
Forma 2:
Con FreeCommanderXE: Ir a C:\pyzo2015a\Scripts --> Ctrl D ó Tools -->
DOS box
Ejecutar: conda.exe con los argumentos indicados mas adelante
Forma 3:
Abrir una cónsola de Ipython ejecutando:
C:\pyzo2015a\ipython_qtconsole.exe
ó
C:\pyzo2015a\ipython_notebook.exe
En el shell ejecutar conda.exe con los argumentos indicados mas
adelante
PIP
Utilidad para buscar, bajar, instalar, desinstalar paquetes del
repositorio pypi de Python.org, el cual contiene mas de 70000
paquetes:
https://pypi.python.org/pypi
Ejemplo:
Biblioteca de funciones:
https://docs.python.org/3/library/index.html
Lista de paquetes:
https://pypi.python.org/pypi
Tutoriales Python:
http://www.python-course.eu/index.php
http://kestrel.nmt.edu/~raymond/software/python_notes/index.htm
http://showmedo.com/videotutorials/python
http://www.swaroopch.com/notes/python/
Tutorial scipy:
http://scipy-lectures.github.io/index
Pyzo
http://www.pyzo.org/
Spyder
https://github.com/spyder-ide/spyder
Anaconda
http://continuum.io/
http://docs.continuum.io/anaconda/pkg-docs#python-3-4
Matplotlib
http://matplotlib.org/index.html
http://matplotlib.org/users/pyplot_tutorial.html
http://matplotlib.org/users/image_tutorial.html
http://matplotlib.org/users/index_text.html
Mayavi
http://docs.enthought.com/mayavi/mayavi/index.html
Mpmath
http://mpmath.org/
http://mpmath.org/doc/current/
Gmpy2
https://gmpy2.readthedocs.org/en/latest/
https://code.google.com/p/gmpy/downloads/list
Numpy
http://kestrel.nmt.edu/~raymond/software/python_notes/paper003.html
http://scipy.github.io/old-wiki/pages/Numpy_Example_List
Scipy
http://scipy-lectures.github.io/intro/scipy.html
http://docs.scipy.org/doc/scipy/reference/linalg.html#scipy.linalg
http://docs.scipy.org/doc/numpy/genindex
Numba
http://numba.pydata.org/
Cython
http://cython.org/
Weave
http://docs.scipy.org/doc/scipy/reference/tutorial/weave.html
f2py
http://docs.scipy.org/doc/numpy/f2py/index.html
Manual de Python
Se encuentra en el siguiente directorio de Windows:
C:\pyzo2015a\Doc\python342.chm
Desde esta página se pueden crear "notebooks", que son documentos que
pueden contener una mezcla de instrucciones Python, resultados, texto
de comentarios, imágenes.
https://www.python.org/shell/
http://www.tutorialspoint.com/codingground.htm
http://www.tutorialspoint.com/execute_python3_online.php
https://ideone.com/
AkelPad (Windows)
http://akelpad.sourceforge.net/en/index.php
CUTE (Linux)
http://cute.sourceforge.net/features.html
Python como calculadora
Residuo de división:
7%4 3
7.6%3.2 1.1999999999999993
Complejos:
(3+4j)**(1+0.5j) (-0.5048246889783181+3.104144076995529j)
Métodos y propiedades
En Python todas las variables, constantes y funciones son objetos,
que pueden tener atributos. En Python los métodos también se
denominan atributos.
Los atributos de un objeto se invocan con la siguiente sintaxis:
objeto.metodo(argumentos) para métodos (funciones del objeto)
objeto.propiedad para propiedades (valores)
La lista de atributos que tiene un objeto se puede obtener con la
función dir.
Por ejemplo:
dir(x) métodos y atributos de la variable x
dir(4.5) métodos y atributos de la constante 4.5
dir(abs) métodos y atributos de la función abs
abs.__dir__() métodos y atributos de la función abs
También se puede determinar si un objeto tiene un atributo particular
mediante la función hasattr:
hasattr(4.5,"__abs__") True
hasattr(4.5,"add") False
Funciones y métodos
En esencia son lo mismo, pero en Python se acostumbra denominar
funciones a los miembros pertenecientes a un módulo (equivalente a
una biblioteca de funciones) o las elaboradas por el usuario. Se
denomina métodos a las funciones pertenecientes a un objeto creado en
el shell de Python o en un programa.
Todos los métodos son funciones, pero no todas las funciones son
métodos porque éstos están asociados a algún objeto.
Una función es independiente de un objeto (aunque en Python un módulo
es también un objeto), mientras que el método depende del objeto.
Esto implica que para usar un método debe existir primero el objeto
que lo contiene.
Con una función es necesario especificar sus argumentos. Con un
método, el objeto forma parte implícitamente de los argumentos. Por
ejemplo:
abs(-3.4) 3.4 (función abs, argumento: -3.4)
(-3.4).__abs__() 3.4 (el arguménto implícito de __abs__() es -3.4)
Si un objeto tiene un método, dicho método aplica sólo a esa clase de
objeto; en cambio, una función puede aplicar a mas de una clase de
objeto
Por ejemplo, la función reshape y el método reshape de numpy.
La función reshape se puede aplicar a un arreglo numpy, a una lista o
una tupla.
Un arreglo numpy también tiene el método reshape, pero las listas y
las tuplas no lo tienen. Es decir, para redimensionar un arreglo
numpy se puede usar el método reshape del arreglo o la función
reshape, pero para listas y tuplas sólo se puede hacer con la función
reshape.
Existen métodos y funciones que realizan exactamente la misma tarea.
Por ejemplo: la función abs y el método __abs__ .
Cuando se da tal caso, los programadores expertos de Python suelen
recomendar utilizar preferiblemente el método asociado al objeto (en
el ejemplo, utilizar __abs__(); sin embargo, si el criterio para
elegir es el tiempo de ejecución, entonces es recomendable probar con
el comando mágico timeit de Ipython para decidir. Por ejemplo, len(x)
es mas rápida que x.__len__().
Los métodos con nombre entre dos pares de guiones bajos como __abs__,
__len__, etc, por convención en Python indican que existe una
correspondiente función, operador o propiedad con igual nombre sin
los guiones, tales como abs() y len(). Esto puede servirle de
advertencia al usuario para no crear una función con igual nombre.
Variables
Se forman por asignación directa o como resultado de alguna operación
o función.
El nombre de una variable sólo puede contener letras y números. No
puede comenzar con un número. Python diferencia entre mayúsculas y
minúsculas.
casipi=3.1416
x3=9.4*5.1-43.8
Xr=Yr=Zr=round(12.7)
x,y,z=14,’perro’,5+7j x 14, y ’perro’, z (5+7j)
Numéricos:
Enteros, punto flotante, complejos
Enteros
De forma predeterminada utiliza 64 bits, pero en Python 3 el tamaño
de los enteros sólo está limitado por la memoria disponible.
Ejemplo: 10**100 es aceptable
Punto flotante
De forma predeterminada son de 64 bits. Sin embargo con las funciones
del módulo numpy se pueden fijar en 16 o 32 bits.
Los rangos de valores, dígitos, precisión, etc se pueden obtener
con funciones del módulo numpy.
Se puede tener números punto flotante de precisión arbitraria con las
funciones de los módulos mpmath o gmpy2.
Otros de precisión arbitraria no tan completos: decimal, bigfloat,
pyGMP
import numpy
print(numpy.finfo(numpy.float))
Complejos
Formados por parejas de números punto flotante. Por lo tanto, de
forma predeterminada cada complejo ocupa 128 bits (64+64).
Los complejos se representan mediante suma algebraica, multiplicando
por J o j la parte imaginaria.
3-4j parte real 3, parte imaginaria -4
1j parte real 0, parte imaginaria 1
3.2+0j parte real 3.2 parte imaginaria 0 (forzando a complejo)
Caracteres
Son los átomos de las cadenas de caracteres. Sin embargo, Python no
tiene el tipo character como otros lenguajes. En Python un caracter
es sólo una cadena (str) de un solo elemento.
Lógicos
Sólo tienen dos valores True y False.
La función bool convierte a lógico.
Números entero, flotante y complejo cero convierten a False. También
contenedores como cadenas, listas, tuplas, conjuntos y diccionarios
vacíos convierten a False. Todo lo demás convierte a True.
bool(0) False
bool(0.0) False
bool("") False
bool(None) False
bool([]) False
bool("abc") True
bool("False") True
bool("0") True
bool(3.49) True
None
Sólo tiene el valor None.
Puede usarse para inicializar variables sin ningún valor.
Si una función no retorna ningún otro objeto, entonces retorna None.
En una función, si algún argumento opcional no es especificado, éste
puede pasar el valor None a la misma.
Contenedores
Son objetos que representan colecciones de objetos, tales como
escalares, funciones y/o otros contenedores. Por ejemplo, una lista o
una cadena de caracteres son casos particulares de contenedores.
Los elementos en un contenedor pueden ser todos del mismo tipo o de
diferentes tipos.
Los principales contenedores son: cadenas ascii, bytes, bytearrays,
listas, tuplas, conjuntos y diccionarios.
Pero existen mas contenedores definidos en otros módulos,
particularmente en el módulo collections
Ejemplos:
[2,3,5,7]+[11,13] --> [2,3,5,7,11,13]
[2,3,5,7]*3 --> [2,3,5,7,2,3,5,7,2,3,5,7]
"¡Oh, oh!." + " Me parece haber visto" + " un lindo gatito"
print(80*"-")
Numerables
Los numerables (sucesiones) se componen de elementos de diferente o
igual tipo, siendo lo distintivo el que sus elementos se pueden
referenciar mediante índices numéricos: 0,1,2,..., comenzando siempre
en 0.
Por ejemplo, si x es un contenedor numerable, sus elementos se
referencian mediante índices entre corchetes: x[0], x[1], x[2], ...
x[n-1]
También se pueden usar índices negativos, donde:
x[-1]=x[n-1]; x[-2]=x[n-2]; … ; x[-k]=x[n-k]; … ; x[-n]=x[0]
x[i][j][k]...[m]
hace referencia al elemento m en un contenedor de múltiples niveles
en x
Los principales numerables en Python son las listas, las tuplas, las
cadenas de caracteres y los arreglos bytes.
El módulo numpy permite crear arreglos (arrays) que son numerables.
Cadenas de caracteres:
Están compuestas de caractes de letras, números y signos.
Se crean asignándolas entre comillas simples o dobles, mediante la
función str o con una función que devuelva una cadena.
Son numerables, concatenables, pero inmutables, lo que significa que
no se pueden modificar sus elementos.
Los operadores + y * actúan como concatenadores de cadenas.
a="Canuto"
len(a) 6 (cantidad de elementos en a)
a[0] C
a[5] o
a[-1] o
a[-2] t
a[-6] C
a[3] = "i" error, porque se intentó modificar un elemento, pero
las cadenas de caracteres son inmutables
a=str(3/4) '0.75' --> con str el resultado numérico se convierte
en una cadena
Índices positivos y negativos en a:
C a n u t o C a n u t o
-6 -5 -4 -3 -2 -1 0 1 2 3 4 5
bytes
Son arreglos inmutables, numerables, concatenables, similares a las
cadenas de caracteres, pero destinados a contener cadenas de bytes,
cuyos valores binarios están entre 0 y 255. Se crean con la función
bytes().
Las cadenas de caracteres sólo contienen caracteres ascii codificados
en binario con valores entre 0 y 127, suficientes para el idioma
Inglés pero insuficientes para los demás idiomas.
Al crear un arreglo bytes hay que especificar la codificación de los
caracteres, que usualmente será "ascii", "latin-1" y "utf-8" en
idiomas latino occidentales.
ascii está limitado a 128 caracteres
latin-1 permite hasta 256 caracteres
utf-8 permite millones de caracteres, porque un carácter puede estar
representado por uno, dos o mas grupos de bytes.
Todas las codificaciones son iguales a ascii en los 128 primeros
caracteres, pero pueden diferir del 129 en adelante.
Ejemplo:
Bytearrays
Son iguales a los arreglos bytes pero mutables.
Se crean con la función bytearray().
Son concatenables con operadores + y * y el operador = produce un
duplicado o alias. Sus elementos son numerables.
Listas:
Se pueden crear especificando sus elementos entre corchetes y
separados por comas, mediante la función list o una función que
devuelva una lista.
Las listas son objetos numerables, concatenables, mutables.
Los operadores + y * actúan como concatenadores de listas.
a = [ 24.5, 45-0.7j, "Garfield", [42,"Pulgoso"]]
a[0] 24.5
a[2] "Garfield"
a[2][0] "G"
a[2][5] e
a[3][1] "Pulgoso"
a[3][1][3] "g"
a[-2] "Garfield"
a[-1][-1][3] predecir el resultado
b=[37] lista de un solo elemento
a=list((2,3,5)) [2,3,5] creación de lista mediante función list
def fu(x): return(x**3-9) se define una función con nombre fu
a=[fu, lambda x: 3*x+7] lista con fu y una función lambda
a[0](3) 18 evaluando en x=3 la función fu
a[1](10) 37 evaluando en x=10 la función lambda
Copias y duplicados
Si se hace:
x=[5,3,7,2]
y=x
aquí y no es una copia de x, sinó un duplicado, réplica o alias, lo
que significa que se trata del mismo objeto con dos nombres.
Si ahora se hace:
y[2]=11
Entonces:
x[2] 11
Como se trata del mismo objeto, al modificar uno se modifica el otro.
x.extend(["perro","gato"]) [5,3,7,2,"perro","gato"]
agrega elementos de otra lista in situ
y=x+["perro","gato"] [5,3,7,2,"perro","gato"]
concatena objetos a la lista, pero no in situ. Es
decir, se preserva el x original
x.insert(100,"perro") [5,3,7,2,"perro"]
equivale a un append si el índice es igual o mayor
que la cantidad de elementos de la lista
y=x.pop(2) y 7; x [5,3,2] extrae in situ el elemento de la
lista indicado por un índice. Es similar al método
remove, pero adicionalmente asigna el elemento
extraido a una variable.
Otros métodos:
x.__contains__(2) True indica si la lista contiene el valor 2.
Debería usarse antes de usar el método index para
evitar error si la lista no contiene el valor.
Opcionalmente se puede utilizar: 2 in x --> True
2 in x True
Tuplas
Son contenedores numerables, concatenables, pero inmutables.
Se pueden crear especificando sus elementos entre paréntesis y
separados por comas, mediante la función tuple o una función que
devuelva una tupla.
Los operadores + y * son concatenadores de tuplas.
a= 2, (2,) tupla de un solo elemento
a= 2,3,5,7 (2,3,5,7)
a= tuple((2,3,5,7)) con la función tuple
a=(2,(3+4j),["Canito","Claudio",(54.2,[25,"r"])])
a[2][2][1][1] "r"
a[2][2][1][1] = p cambia "r" por "p" en una lista en a
a[0]=3 error porque se intentó modificar una tupla
def fu(x): return(x**3-9) se define una función con nombre fu
a=(fu, lambda x: 3*x+7) tupla con fu y una función lambda
a[0](3) 18 evaluando en x=3 la función fu
a[1](10) 37 evaluando en x=10 la función lambda
Conjuntos
Son contenedores mutables de elementos inmutables, no indexables. Se
crean especificando sus elementos (sólo inmutables), entre llaves,
separados por comas, mediante la función set, o una función que
devuelva un conjunto.
Al crear un conjunto, los elementos repetidos son reducidos a uno
solo.
Los conjuntos no son concatenables con los operadores + y *
Diccionarios
Contenedor mutable en la que los valores (values) se referencian por
claves (keys). Las claves son índices inmutables tales como números
enteros, flotantes, cadenas de caracteres o tuplas.
El indexado es asociativo, pero no numerable (hash).
Los diccionarios no son concatenables con los operadores + y *
Un diccionario se puede formar mediante parejas de clave, valor donde
la clave y su valor se separan con : .
También se puede usar la función dict o una función que devuelva un
diccionario.
Ejemplos:
Secciones en numerables
Permiten obtener subconjuntos de contenedores numerables. Son
similares a los rangos en Octave.
Están definidos por un trío de números: inicio, final e incremento,
separados por dos puntos (:)
inicio:final:incremento
Los valores predeterminados, si se omiten son:
inicio = 0
final = n-1, donde n es el número de elementos del contenedor
incremento = 1
Cuando el índice final se indica explícitamente, el correspondiente
elemento no se incluye en el subconjunto.
El valor final y el incremento pueden ser negativos.
Ejemplos:
A=[2,3,5,7,11]
A[1] 3
A[:] [2, 3, 5, 7, 11]
A[::] [2, 3, 5, 7, 11]
A[:4] [2, 3, 5, 7] (elemento final 4 es 11, pero no se incluye)
A[:10] [2, 3, 5, 7, 11]
A[1:] [3, 5, 7, 11]
A[1:3] [3, 5]
A[::2] [2, 5, 11]
A[::-1] [11, 7, 5, 3, 2]
A[3::-1] [7, 5, 3, 2]
A[3:0:-1] [7, 5, 3]
A[3:1:-1] [7, 5]
A[:-1] [2, 3, 5, 7] (elemento final -1 es 11, pero no se incluye)
A[:-2] [2, 3, 5]
A[-2] [7]
[A[i] for i in (1,3,2)] [3, 7, 5] (usando comprensión)
Tabla de contenedores y algunas de sus características
Contenedor Mutable o Copia o Elementos Concatenable o
inmutable duplicado con numerables o no concatenable
operador = no numerables con operadores
+ *
lista mutable duplicado numerables concatenable
tupla inmutable copia numerables concatenable
cadena de inmutable copia numerables concatenable
caracteres
conjunto mutable duplicado no numerables no concatenable
pero
elementos
inmutables
diccionario mutable duplicado no numerables no concatenable
bytes inmutable copia numerables concatenable
bytearray mutable duplicado numerables concatenable
Instrucciones de Python
Rangos
Igual que en Octave, los rangos consistentes en un trío de números
que definen un valor inicial, un incremento y un valor tope.
Los rangos básicos de Python son sólo con números enteros.
Sin embargo, es posible utilizar rangos con punto flotante usando el
módulo Numpy.
La principal utilidad de los rangos es para iterar.
Ejemplos:
list(range(3)) [0,1,2] (inicio=0, incremento=1, tope=3)
tuple(range(3,7)) (3,4,5,6) (inicio=3, incremento=1, tope=7)
tuple(range(3,11,2)) (3,5,7,9) (inicio=3, incremento=2, tope=11)
list(range(15,6,-3)) [15,12,9] (inicio=15, incremento=-3, tope=6)
list(range(8,2)) [] (vacía) (inicio=8, incremento=1, tope=2)
tuple(range(5,5)) () (vacía) (inicio=5, incremento=1, tope=5)
Condicionales if
Ejemplo:
dice="miau"
if dice=="guau":
print("bicho= perro")
elif dice=="miau":
print("bicho= gato")
else:
print("bicho= gallo")
Notar que las líneas con if, elif y else terminan obligatoriamente
con : .
elif equivale a else if ó elseif de otros lenguajes.
Igual que en otros lenguajes, las instrucciones elif y else son
opcionales.
El sangrado de las instrucciones dentro del bloqe if es obligatorio
en Python. El sangrado debe ser de 1 o mas espacios (pero todos
iguales dentro del mismo bloque).
Es permitido poner una o varias instrucciones en una misma línea
separadas por ; siempre que no se tenga mas de una instrucción que
requiera sangrado como if, elif, else, for, while
Ejemplo:
dice="miau"; perro="Canuto"; gato="Garfield"; gallo="Claudio"
if dice=="guau": print("bicho= perro"); print(perro)
elif dice=="miau": print("bicho= gato"); print(gato)
else: print("bicho= gallo"); print(gallo)
Ciclos for
Ejemplos:
for x in 2,3,5,7: #(notar los : obligatorios al final)
y=x*2-1 #(sangría obligatoria de uno o mas espacios)
print(y)
Imprime:
guau
miau
for k in range(3,9,2):
print(k)
Instrucción continue
Se utiliza para terminar una iteración en ciclos for o while. No
termina el ciclo for, sinó sólo la iteración actual.
Ejemplo
Imprime el cuadrado de los números pares.
for k in range(1,10):
if k%2: continue
print("k*k= ",k*k)
Ejemplo
Imprime el cuadrado de los números impares menores que 13.
for k in range(100):
if k==13: break # termina ciclo for si k==13
if k%2-1: continue # termina iteración actual si k es par
print("k*k= ",k*k)
x=[2,3,5,7]
[pow(x[k],0.5) for k in range(len(x))]
[1.4142135623730951, 1.7320508075688772, 2.23606797749979,
2.6457513110645907]
len(x) es una función que indica la cantidad de elementos en la lista
x. En general, la función len() indica la cantidad de elementos en un
contenedor tales como cadenas de caracteres, listas, tuplas,
conjuntos y diccionarios.
Ejemplo
Obtener el cuadrado de cada elemento de una lista de listas. El
resultado es otra lista de listas con la misma estructura.
A=[[2,3,5],[7],[11,13]]
[[(A[i][j])**2 for j in range(len(A[i]))] for i in range(len(A))]
[[4, 9, 25], [49], [121, 169]]
Aquí hay dos ciclos for. El mas interno con la variable j se mueve
por las "columnas" y donde len(A[i]) indica la cantidad de columnas
en la "fila" i-esima.
La variable i mueve las "filas" y len(A) indica la cantidad de filas
en la lista A.
for a in range(2,10):
for b in range(a+1,100):
c=(a*a+b*b)**0.5
if int(c)==c:
print("Trío de Pitágoras: ",a,b,int(c))
break
else:
print("No hay trío con a= ",a)
Instrucción while
Ejemplo
Se trata del método de Newton tratando de encontrar
una raiz real que no existe: y = x**2+1 = 0
Es un ejemplo sólo para ilustrar la instrucción while,
no realiza ningún cálculo útil.
Operadores lógicos
not 5 False
not 0 True
5 > 2 True
not 5 > 2 False (se traduce en: 0 > 2 False)
5 > (not 2) True (se traduce en: 5 > 0 True)
Ejemplos de Matemática:
Conjunto definido por extensión:
𝐴 = { 2, 3, 5, 7 } (números primos menores que 10)
Observaciones:
- La lista y el conjunto pueden ser creados usando corchetes y llaves
o las funciones list y set respectivamente, pero la tupla tiene que
ser creada con la función tuple; sinó sólo crea una clase de objeto
denominado "generator" o generador.
Los generadores no contienen valores, sinó sólo la receta para
crearlos y ponerlos en un contenedor como una lista, tupla o
conjunto. También para usarlo en ciclos for.
La ventaja del generador es que no ocupa memoria RAM con los valores
hasta que eventualmente sean necesarios.
Los generadores sólo se pueden usar una vez. A la segunda o mas veces
sólo producirá conjuntos vacíos.
Por ejemplo, si B es un generador:
C=list(B) producirá una lista
Ejercício:
Obtener una tupla con los números enteros múltiplos de 3 comprendidos
entre 0 y 50
Ejemplo con dos variables y condicional:
C=[(x*x+y*y)**0.5 for x in [2,4,6,8] for y in [1,3,5,7,9] if abs(x-
y)<3]
Tarea
Calcular la aproximación de arctan(x) con 10 términos de la serie de Taylor
para x=0.ijk, donde ijk son los 3 últimos dígitos de su cédula. La serie se
obtiene con una comprensión y después se usa la función sum para sumar los
términos.
𝑥3 𝑥5 𝑥7
𝑎𝑟𝑐𝑡𝑎𝑛(𝑥) = 𝑥 − + − + ⋯ , −1 ≤ 𝑥 ≤ 1
3 5 7
Funciones lambda
Son el equivalente de las funciones inline en Octave.
Consiste en una función definida con una sola instrucción.
Ejemplo:
f=lambda x,y: 3*x + 2*y (x,y representan los argumentos)
f(1,2) 7 (x=1, y=2)
f(y=3,x=0) 6
Función map
Su utilidad es aplicar una función a cada elemento de uno o varios
contenedores para obtener otro contenedor con el resultado. Equivale
a vectorizar funciones aplicadas a contenedores.
Ejemplo.
Obtener una lista con los cuadrados de los elementos de la lista A
A=[2,3,5,7]
Problema: puesto que A es una lista, no es válido hacer pow(A,2),
porque las funciones normales de Python no están vectorizadas.
O bién:
C = map( lambda x: pow(x,2), A )
for i in C: print(i) 4,9,25,49
En este ejemplo se tuvo que usar una función lambda porque pow
requiere dos argumentos.
Si el problema fuese obtener el valor absoluto de los elementos de la
lista sería suficiente con:
list( map(abs,A) )
Implícitamente abs tomaría como argumento los elementos de A uno a
uno.
A=[2,3,5,7]
B=[11,13,17,19]
C=map( lambda x,y: x*y, A,B )
list(C) [22, 39, 85, 133]
def f(x,y,z):
return(x+y-z)
x=[1,2,3]; y=[4,5,6]; z=[7,8,9]
list(map(f,x,y,z)) [-2, -1, 0]
Tareas
Definir la función signo y aplicarla a los elementos de un contenedor para
obtener el resultado en una lista.
Por ejemplo: list( map(signo, [-5.7, 3.21, 0.0]) ) [-1, 1, 0]
Función filter
Su utilidad es seleccionar elementos de un contenedor en base a una
función que produce resultados lógicos True o False. Con filter no se
calcula nada: la función sólo se utiliza para evaluar cada elemento
del contenedor, y se toman sólo aquellos elementos para los cuales la
función lógica produce True. Por lo tanto, el resultado estará
constituido por un subconjunto del contenedor original. Como casos
particulares, puede ser vacío o igual al original.
Forma genérica:
filter(función lógica, contenedor)
Para funciones mas complicadas se puede usar una función definida por
el usuario en lugar de una lambda.
https://docs.python.org/3/library/functions.html
Funciones matemáticas
abs
Obtiene la magnitud de un escalar, sea real o complejo
abs(-3.7) 3.7
abs(-1.2+1.6j) 2.0
pow
Eleva un número a una potencia. Opcionalmente obtiene un residuo.
Para obtener residuo todos los argumentos deben ser enteros, y el
segundo debe además ser positivo.
pow(49,0.5) 7.0
pow(7,2,5) 4
complex
Devuelve un número complejo dados dos números o una cadena
convertible.
complex(7) (7+0j)
complex(0,1) 1j
complex(5.12, 32.9) (5.12+32.9j)
complex(3+4j,5+6j) (-3+9j) = 3+4j + j*(5+6j)
complex("11+7j") (11+7j) (la cadena no debe tener espacios)
divmod
Devuelve una tupla con el cociente y el residuo dados el dividendo y
el divisor. El cociente es siempre un número sin decimales. El
residuo puede tener decimales.
Los argumentos no pueden ser números complejos.
divmod(23.5,8.5) (2.0,6.5)
max
Devuelve el mayor elemento en un contenedor o el mayor de los
argumentos.
Si son caracteres, toma el que tenga mayor código ascii.
Los argumentos no pueden ser números complejos.
max("Los pollitos dicen") 't'
max("a","A") 'a'
max([34,12,6,69] 69
min
Devuelve el menor elemento en un contenedor o el menor de los
argumentos.
Si son caracteres, toma el que tenga menor código ascii.
Los argumentos no pueden ser números complejos.
min("Los pollitos dicen") ' ' (espacio en blanco)
min("a","A") 'A'
min([34,12,6,69] 6
round
Redondea un número a una cantidad especificada de decimales. Si no se
especifican, redondea a cero decimales.
round(7.6841, 2) 7.68
sum
Sumatoria de elementos de un contenedor de sólo números, puede tener
valor inicial, sinó supone cero.
sum([3,2],4) 9 # valor inicial = 4
sum([2,3,5,7]) 17
patas={"gallina":2,"perro":4,"mosca":6,"araña":8} # diccionario
sum(patas.values()) 20
Funciones de conversión
ascii
Devuelve la representación en caracteres ascii de un objeto. Genera
un objeto str. Sólo alfanuméricos (letras, números, signos).
ascii(24.7) '24.7'
ascii([2,3,5,7]) '[2,3,5,7]'
ascii(abs) '<built-in function abs>'
repr
Devuelve la representación en caracteres ascii de un objeto. Equivale
a la función ascii. Tienen los mismos métodos.
str
Devuelve un objeto arreglo de bytes inmutable de los caracteres de un
objeto. Se puede especificar la codificación. Incluye caracteres de
control y código desde 0 hasta 255.
Si no se especifica, utiliza utf-8 para codificar y decodificar.
("ascii", "latin-1", "utf-8")
a=str(3.6).encode("latin-1") b'3.6'
a=str.encode("Cañón") b'Ca\xc3\xb1\xc3\xb3n' (utf-8 predet.)
a=str.encode("Cañón","latin-1") b'Ca\xf1\xf3n'
b=a.decode("latin-1") Cañón
bytes
Similar a str, pero siempre se debe especificar la codificación.
Difiere en algunos métodos con str. Enteros entre 0 y 255.
bytearray
Similar a bytes, pero produce un objeto arreglo de bytes mutable.
bin
Convierte un entero a una cadena de caracteres de la representación
binaria, con prefijo "0b"
bin(69) '0b1000101'
oct
Convierte un entero a una cadena de caracteres de la representación
octal, con prefijo "0o"
oct(69) '0o105'
hex
Convierte un entero a una cadena de caracteres de la representación
binaria con prefijo "0x"
hex(69) '0x45'
chr
Devuelve el caracter correspondiente a un entero en el código Unicode
chr(69) 'E'
ord
Devuelve el entero del código Unicode correspondiente a un caracter
ord("E") 69
float
Devuelve un número en punto flotante
float(69) 69.0
float("69.69") 69.69
float("250e-3") 0.25
int
Devuelve un número entero. Se puede especificar una base.
Si el argumento es un número con decimales, trunca los decimales.
int(5.98) 5
int("45",16) 69 # 45 base 16 a decimal
int("0x45",16) 69
int("5.98") error
int("0x45") error
bool
Devuelve un escalar lógico True o False.
Todas las cadenas convierten a True excepto la cadena vacía.
Todos los valores numéricos convierten a True excepto el cero entero,
flotante o complejo
bool("Los pollitos dicen") True
bool("") False
bool("0") True
bool(5) True
bool(0) False
bool(0.0) False
Funciones lógicas
all
Retorna True si todos los elementos de un iterable son True o si el
iterable está vacío. En los diccionarios comprueba sólo las claves.
all("Los pollitos dicen") True
all("") True
all([2,3,5,7]) True
all([2,3,0,5,7]) False
any
Retorna True si al menos un elemento de un iterable es True.
Si el iterable está vacío retorna False. En los diccionarios
comprueba sólo las claves.
any("Los pollitos dicen") True
any("") False
any([0,0,0,0,0]) False
any([2,3,0,5,7]) True
Funciones diversas
dir
Sin argumentos retorna una lista de objetos en el ambiente actual
for x in dir(): print(x)
eval
Evalúa una cadena con una sola instrucción Python
eval("round(3.3)") 3
exec
Ejecuta cualquier cantidad de instrucciones Python, las cuales pueden
estar en una cadena de texto, en un archivo, o en código compilado en
bytecodes. Esto permite, por ejemplo, ejecutar programas creados al
instante por otro programa.
programa="for i in range(4):\n print(i*i)" (instrucciones en texto)
exec(programa) 0 1 4 9 (salida en columna)
help
Presenta ayuda sobre un objeto. Es para usarse de forma interactiva
en un shell de Python
help(list) ayuda sobre list
id
Regresa un número correspondiente a una dirección en memoria de un
objeto. Dos objetos que tengan el mismo id son el mismo objeto.
input
Asigna un valor a una variable de forma interactiva, igual que
Octave, pero el valor asignado es siempre una cadena.
muna=input("Papá dame real <== ")
Papá dame real <== 100
muna 100 (cadena de texto)
print
Impresión con formato.
El separador predeterminado es espacio en blanco y el terminador de
línea avance de línea:
x, y = 5, 4.2
print(x,y,"perro") 5 4.2 perro
print(x,y,"perro",sep=" – ") 5 - 4.2 – perro
open
Función para lectura y escritura de archivos, de texto o binarios
Crea un objeto file, el cual tiene métodos para leer, escribir,
posicionar puntero de lectura/escritura, cerrar el archivo, etc.
El objeto creado es un iterador.
open tiene un argumento obligatorio y muchos opcionales.
El argumento obligatorio es el nombre del archivo a abrir
(preexistente o nuevo)
Entre los argumentos opcionales los mas usados son el modo y la
codificación de los archivos de texto.
Ejemplos:
Abrir bichos.txt . Predeterminados: texto y solo lectura.
Opcional: codificación utf-8 del texto.
ida es el identificador del objeto file:
ida=open("bichos.txt",encoding="utf-8")
ida=open("bichos.txt",mode="w")
ida=open("bichos.txt",mode="wb")
Tabla de modos:
'r' sólo lectura (predeterminado). El archivo debe existir.
Puntero al inicio del archivo.
'w' sólo escritura, inicializa el archivo como vacío.
'a' sólo escritura, agregando al final del archivo. Si no
existe lo crea. Puntero al final del archivo.
'x' crea el archivo para escritura, sólo si no existe.
'r+' abre para lectura y escritura. El archivo debe existir.
Puntero al inicio del archivo.
'w+' abre para lectura y escritura. Inicializa el archivo como
vacío.
'a+' abre para lectura y escritura al final del archivo. Si no
existe lo crea. Se puede leer en cualquier posición, pero
en la escritura siempre agrega al final del archivo.
Puntero al inicio del archivo en posición de lectura.
'x+' abre para lectura y escritura. Crea el archivo sólo si no
existe.
for i in range(len(formacion)):
linea = " ".join((formacion[i], str(velocidad[i])))
ida.write( linea + "\n" )
ida.close()
Se definen dos listas, una con nombres de formaciones geológicas y
otra con velocidades sísmicas.
Todo debe ser texto, por eso la velocidad se convierte a texto con la
función str.
El método write sólo acepta como argumento una cadena de texto. Pero
el método writelines acepta también un contenedor con cadenas de
texto. Sin embargo, queda a cargo del programador agregar separadores
y fin de línea.
Otras instrucciones:
ida.readline() lee una línea de cada vez
ida.readline(n) lee n bytes
ida.readlines() lee todo el archivo de texto a una lista 2D. Ideal
para archivos con datos en columnas. Se debe
disponer de suficiente memoria RAM libre para
almacenarlo.
ida.read() lee todo el archivo como una cadena de texto en modo
texto o una cadena de bytes en modo binario. Se debe
tener suficiente memoria RAM libre para almacenarlo.
ida.read(n) lee n caracteres en modo texto o n bytes en modo
binario.
Ejemplo:
datosgravedad=open("CG5.txt","r").readlines()
datosgravedad será una lista 2D que contiene una línea de archivo por
fila, todo en texto sin separar en campos.
La separación se puede hacer con los métodos de cadenas strip()
seguido de split(). Después las cadenas separadas se pueden convertir
a flotantes con float() y enteros con int(). Todo con comprensiones o
con map si todos son del mismo tipo.
for i in range(len(formacion)):
formab=bytes(formacion[i],encoding="utf-8")
paquete = struct.pack("8sd",formab,velocidad[i])
ida.write(paquete)
ida.close()
#----------------------------------------------------------
# Lectura de archivo binario
form=[]
vel=[]
Las cadenas de caracteres tienen que ser primero codificadas, sea con
la función str, con la función bytes o con el método encode de
cadenas.
En este ejemplo se utiliza la función bytes para codificar a utf-8.
El resultado se guarda en la variable formab.
Codificaciones de caracteres
https://docs.python.org/2.4/lib/standard-encodings.html
http://www.joelonsoftware.com/articles/Unicode.html
letras='Á','É','Í','Ó','Ú','á','é','í','ó','ú','Ñ','ü','Ñ','ñ','¿','¡
'
print(" Codificacion de caracteres en Python")
print(" utf-8 latin-1 cp1252 cp850")
for c in letras:
print(c,bytes(c,"utf8"),bytes(c,"latin-
1"),bytes(c,"cp1252"),bytes(c,"cp850"))
Funciones importadas
Al igual que otros lenguajes de programación Python cuenta con una
gran cantidad de funciones externas, que se almacenan en "módulos"
temáticos. Los módulos son objetos.
Los de SciPy.org:
http://www.scipy.org/
Forma 1
Importar funciones individuales de un paquete
Ejemplo: importar las funciones coseno, seno y tangente del módulo
math:
Forma 2
Importar funciones de un módulo con un alias
Ejemplo:
Importar funciones con otro nombre puede ser útil para evitar
coincidencia de nombre con una función de otro paquete o para
simplificar el nombre.
Forma 3
Importar el módulo sin especificar las funciones
Ejemplo:
import math
math.cos(3) -0.9899924966004454
math.sin(math.pi/2) 1.0
De esta forma, todas las funciones del módulo math están disponibles,
pero cada función debe ser referenciada con el nombre del módulo, un
punto y nombre de la función.
En el ejemplo math.pi es una constante igual al número pi.
Este método tiene la ventaja de que no habrá coincidencia de
funciones con el mismo nombre en diferentes módulos, porque se
diferencian por el nombre del módulo.
Forma 4
Importar todas las funciones de un módulo
Importando de un paquete
Se referencia mediante la sintaxis de puntos:
paquete.módulo.función
Ejemplo:
Importar del paquete "geofisica", módulo "sismicos" la función "Dix"
from geofisica.sismicos import Dix
def f1(x,y):
p=f2(x)
q=f3(y)
return p*q
def f2(a):
return a*a
def f3(b):
return pow(b,0.5)
s=14
t=9
r=f1(s,t)
print(r)
Observaciones:
La instrucción def inicia un bloque con : en la línea inicial. Las
demás instrucciones deben tener sangría.
La función puede retornar cero, uno o mas valores
La función termina cuando encuentra una instrucción return
Una función puede tener una o mas instrucciones return
Forma 2
Funciones de usuario separadas en archivos individuales. Cada archivo
constituye un módulo con un solo método.
Supongamos que la función f1 se define y guarda en un archivo llamado
fu1.py
Igualmente f2 se define y guarda en fu2.py y f3 en fu3.py
Para poder usar estas funciones es necesario importarlas antes de
usarlas en cualquier otro programa principal o función.
Por ejemplo es necesario importar f2 y f3 en f1. Pero f2 se encuentra
en el archivo fu2.py y f3 en el archivo fu3.py:
def f1(x,y):
import fu2,fu3
p=fu2.f2(x)
q=fu3.f3(y)
return p*q
import fu1
s=14
t=9
r=fu1.f1(s,t)
print(r)
En este ejemplo se dispuso una sola función por archivo, pero es mas
útil como módulo si se definen en un mismo archivo diversas funciones
con relación a algún tema.
Las funciones a importar deben estar en la ruta de búsqueda de
módulos de Python, el cual suele incluir el directorio actual.
FUNCIONES MATEMÁTICAS
Las funciones matemáticas internas de Python son muy pocas: pow, abs,
complex, sum, max, min, divmod, round.
Se agregan los atributos real, imag y el método conjugate de
escalares números complejos.
Para disponer de otras funciones matemáticas y de métodos numéricos
es necesario importarlas de módulos especializados.
Algunos de estos módulos son:
cmath contiene las mismas funciones que math pero acepta argumentos
complejos y puede producir resultados complejos.
Nota 1:
numpy.int_ sólo acepta enteros dentro del rango de valores de enteros
tipo intc
Nota 2:
numpy.array(x,dtype="str") ≠ numpy.str(x) = x.__str__()
Tipo Descripción
bool_ Lógico. True o False. 1 byte
int_ Entero predeterminado. Igual a long en C. 32 o 64 bits
intc Entero igual a int en C. 32 o 64 bits
intp Entero para indexado. 32 o 64 bits
byte Entero. Equivale a int8
int8 Entero. Rango: -128 a 127
int16 Entero. Rango: -32768 a 32767
int32 Entero. Rango: -2147483648 a 2147483647
int64 Entero. Rango: -9223372036854775808 a 9223372036854775807
uint8 Entero sin signo. Rango: 0 a 255
uint16 Entero sin signo. Rango: 0 a 65535
uint32 Entero sin signo. Rango: 0 a 4294967295
uint64 Entero sin signo. Rango: 0 a 18446744073709551615
float_ Flotante predeterminado. Equivale a float64
float16 Flotante: signo 1 bit, exponente 5 bits, mantisa 10 bits
float32 Flotante: signo 1 bit, exponente 8 bits, mantisa 23 bits
float64 Flotante: signo 1 bit, exponente 11 bits, mantisa 52 bits
complex Complejo. Equivale a complex128
complex64 Complejo formado por dos flotantes de 32 bits
complex128 Complejo formado por dos flotantes de 64 bits
Todos estos tipos en la tabla se puede usar con el argumento dtype= o
como método Numpy.
Con relación a los métodos Numpy que existen sin guión y con guión
bajo al final del nombre, tales como int, bool, complex, los que
terminan con guión bajo se aplican a arreglos y los que no tienen
guión a escalares.
numpy.iinfo(numpy.int16).min -32768
numpy.iinfo(numpy.int16).max 32767
xff=xcf.astype("float")
xff array([ 3.48, -17.6 , 0.25])
x1=numpy.array([2,3,5])
x2=numpy.array([7,11,13])
x1+x2 array([ 9, 14, 18]) (suma puntual, no concatena)
x1*x2 array([14, 33, 65]) (producto puntual)
x2/x1 array([ 3.5 , 3.66666667, 2.6 ])
x2**x1 array([ 49, 1331, 371293], dtype=int32)
x2%x1 array([1, 2, 3], dtype=int32)
Las operaciones con escalares son del escalar con cada elemento del
arreglo:
3+x1 array([5, 6, 8])
3*x1 array([ 6, 9, 15]) (producto puntual, no concatena)
x1/3 array([ 0.66666667, 1. , 1.66666667])
3/x1 array([ 1.5, 1. , 0.6])
3**x1 array([ 9, 27, 243], dtype=int32)
x1**3 array([ 8, 27, 125], dtype=int32)
x1%3 array([2, 0, 2], dtype=int32)
3%x1 array([1, 0, 3], dtype=int32)
numpy.sqrt(x.astype("complex"))
array([ 0.+1.41421356j, 0.+1.73205081j, 0.+2.23606798j,
0.+2.64575131j])
Otra forma:
numpy.sqrt(x+0j)
array([ 0.+1.41421356j, 0.+1.73205081j, 0.+2.23606798j,
0.+2.64575131j])
numpy.sqrt(numpy.complex_(x))
array([ 0.+1.41421356j, 0.+1.73205081j, 0.+2.23606798j,
0.+2.64575131j])
Ejemplos:
A array([[1, 2],
[3, 4],
[5, 6]])
Matrices:
M=numpy.matrix([[1,2], [3,4], [5,6]]) (matriz)
M matrix([[1, 2],
[3, 4],
[5, 6]])
Sean:
A=numpy.array([1,2,3,4,5,6]).reshape((3,2)) (arreglo 2D, 3x2)
a=numpy.array([7,8]).reshape((2,1)) (arreglo 2D, 2x1)
A array([[1, 2],
[3, 4],
[5, 6]])
a array([[7],
[8]])
M matrix([[1, 2],
[3, 4],
[5, 6]])
m matrix([[7],
[8]])
A[0,1] 2
M[0,1] 2
Métodos equivalentes:
M.getI == M.I
M.getH == M.H
M.getA1 == M.A1
M.getA == M.A == numpy.asarray(M)
Ejemplos:
A[2,1] 6 (elemento fila 2, columna 1)
A[2][1] 6 (elemento fila 2, columna 1)
A[1] array([3, 4]) (fila 1, contando desde 0)
A[1:2] array([3, 4]) (fila 1, notar que no incluye la fila 2)
A[:2] array([[1, 2], (filas 0 y 1)
[3, 4]])
A[:,0] array([1, 3, 5]) (columna 0, el arreglo resultante es 1D)
M[:,0] matrix([[1], (columna 0, el arreglo resultante es una
[3], matriz columna)
[5]])
Transpuesta
Forma 1
A.T array([[ 2, 7, 17], (transpuesta de arreglo)
[ 3, 11, 19],
[ 5, 13, 23]])
Forma 2
A.swapaxes(1,0) array([[ 2, 7, 17], (transpuesta de arreglo)
[ 3, 11, 19],
[ 5, 13, 23]])
Ceros, vacíos
Determina si al menos uno de los miembros de A produce lógico True.
Si los elementos no son lógicos, realiza la conversión habitual donde
numéricos 0 y cadena vacía produce False y todo lo demás produce
True.
Si no se especifica el eje, aplica a todo el arreglo.
A.any() True
A.any(axis=0) array([ True, True, True], dtype=bool)(por columnas)
A.sum() 100
A.sum(axis=1) array([10, 31, 59]) (suma por filas)
A.prod() 223092870
A.prod(axis=0) array([ 238, 627, 1495]) (producto por columnas)
Producto escalar
Los arreglos deben ser concordantes para que funcione
A.dot([1,2,3]) array([ 23, 68, 124])
Traza
Obtiene la traza del arreglo, consistente en la suma de los elementos
de la diagonal principal o de cualquier otra diagonal especificada.
A.trace() 36 (traza de la diagonal principal)
Método resize
Cambia insitu las dimensiones de un arreglo. La diferencia con
reshape es que no crea una copia, sinó que modifica las dimensiones
del objeto original. Con el operador = produce un objeto NoneType
numpy.expand_dims(x,1)
array([[1], (arreglo 2D, en eje 1)
[2],
[3]])
x[:,numpy.newaxis]
array([[1], (arreglo 2D, en eje 1)
[2],
[3]])
Dimensiones de un arreglo
Devuelve una tupla con las dimensiones del arreglo
A.shape (3,3)
Tamaño de un arreglo
Indica la cantidad total de elementos del arreglo
A.size 9
Obtener magnitud:
A.__abs__()
obtener conjugado:
A.conj()
Funciones numpy
La cantidad de funciones de Numpy es muy grande. En la versión mas
reciente según len(dir(numpy))tiene al menos 586. Pero en realidad
son mas porque algunos son objetos que contienen otros objetos, como
numpy.linalg, numpy.random
Entre ellas están las habituales:
trigonométricas, hiperbólicas, exponenciales y logarítmicas.
Funciones para números aleatorios, estadísticas, polinomios, álgebra
lineal, matrices
numpy.ones((2,3),dtype="int")
array([[1, 1, 1],
[1, 1, 1]])
Arreglo unidad
numpy.eye(3)
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
Arreglo "vacío"
Crea un arreglo vacío, cuyos valores son los que tenga el sector de
memoria reservado para el arreglo en ese momento.
Se debe especificar dimensiones del arreglo en una tupla, y
opcionalmente el tipo de elementos.
numpy.empty((2,3),dtype="int")
array([[0, 0, 0],
[0, 0, 0]])
Arreglos "como"
Funciones para crear arreglos de todo ceros, todo unos o vacío con
las mismas dimensiones que un arreglo preexistente.
A=numpy.array([[ 47, -17, -96],[-15, -91, -53]])
A
array([[ 47, -17, -96],
[-15, -91, -53]])
numpy.zeros_like(A)
array([[0, 0, 0], (arreglo todo ceros de dimensiones como A)
[0, 0, 0]])
numpy.ones_like(A)
array([[1, 1, 1], (arreglo todo unos de dimensiones como A)
[1, 1, 1]])
numpy.empty_like(A)
array([[0, 0, 0], (arreglo "vacío" de dimensiones como A)
[0, 0, 0]])
Copia de un arreglo
Los arreglos numpy son mutables. El operador = crea un duplicado del
arreglo, no una copia independiente.
Para crear una copia independiente se usa el método copy o la función
numpy.copy
B=A.copy() con el método copy
B is A False
B=numpy.copy(A) con la función copy
B is A False
Traza de arreglo
Calcula la traza de un arreglo. De forma predeterminada según la
diagonal principal.
A=n.random.random_integers(-100,100,(2,3))
A array([[ 47, -17, -96],
[-15, 91, 53]])
numpy.trace(A)= 138 (47 + 91)
Se recomienda usar el método: A.trace() -44
Determinante de arreglo
Calcula el determinante de un arreglo numérico 2D cuadrado.
El arreglo puede ser una lista, una tupla o un arreglo numpy.
A=[[1,2,3],[4,5,6],[7,8,0]]
numpy.linalg.det(A) 27.0
Norma de arreglo
De forma predeterminada calcula la norma de Frobenius. En el caso de
listas o tuplas calcula las normas del arreglo linealizado.
En el caso de arreglos Numpy, puede calcular normas por dimensiones,
tal como filas o columnas en el caso de un arreglo 2D.
A=[[1,2,3],[4,5,6],[7,8,0]]
numpy.linalg.norm(A) 14.282856857085701 (norma Frobenius)
numpy.linalg.norm(A,ord=2) 13.201458618948674 (norma cuadrática)
numpy.linalg.norm(numpy.array(A),ord=2,axis=0) (norma 2 por columnas)
array([ 8.1240384 , 9.64365076, 6.70820393])
Inversa de arreglo 2D
Calcula la matriz inversa de un arreglo numérico 2D cuadrado.
El arreglo puede ser un arreglo numpy, una lista o una tupla, pero el
resultado siempre será un arreglo numpy.
El arreglo debe ser numérico, 2D, cuadrado, no singular.
A=[[-1,4,1],[0,-5,-2],[3,10,6]]
numpy.linalg.inv(A)
array([[-10., -14., -3.],
[ -6., -9., -2.],
[ 15., 22., 5.]])
Pseudoinversa de arreglo 2D
Calcula la matriz pseudoinversa Moore-Penrose de un arreglo numérico
2D rectangular. Como caso particular, si la matriz es cuadrada y no
singular, entonces la pseudoinversa es igual a la inversa.
El arreglo puede ser un arreglo numpy, una lista o una tupla, pero el
resultado siempre será un arreglo numpy.
El arreglo debe ser numérico, 2D.
Nota:
También se puede usar el método I para calcular inversa y
pseudoinversa de un objeto matrix.
Esto funciona bien si el arreglo es rectangular no cuadrado, pero si
es cuadrado intentará calcular la inversa y no la pseudoinversa.
Ejemplo:
Arreglo rectangular, calcula pseudoinversa:
numpy.matrix([[1,2,3],[4,5,6]]).I
matrix([[-0.94444444, 0.44444444],
[-0.11111111, 0.11111111],
[ 0.72222222, -0.22222222]])
Cambio de forma
A array([[ 47, -17, -96],
[-15, 91, 53]])
numpy.reshape(A,(3,2))
array([[ 47, -17],
[-96, -15],
[ 91, 53]])
Cambio a arreglo 1D
A array([[ 47, -17, -96],
[-15, 91, 53]])
numpy.fliplr(A)
array([[-96, -17, 47],
[ 53, 91, -15]])
numpy.flipud(A)
array([[-15, 91, 53],
[ 47, -17, -96]])
numpy.roll(A,1,0)
array([[-15, 91, 53], (rodar filas una vez hacia abajo)
[ 47, -17, -96]])
numpy.roll(A,2,1)
array([[-17, -96, 47], (rodar columnas dos veces a la izquierda)
[ 91, 53, -15]])
numpy.rot90(A)
array([[-96, 53], (arreglo rotado 90° antihorario)
[-17, 91],
[ 47, -15]])
numpy.rot90(A,1)
array([[ 53, 91, -15], (arreglo rotado 180° antihorario)
[-96, -17, 47]])
Matriz de Vandermonde
Dado un arreglo 1D, crea un arreglo 2D de Vandermonde, cuyas columnas
son potencias puntuales del arreglo 1D.
De forma predeterminada el arreglo es cuadrado, de potencias
decrecientes, pero opcionalmente esto se puede cambiar.
Ejemplo Vandermonde de 4 columnas, potencias crecientes:
numpy.vander([2,3,5],4,True) array([[ 1, 2, 4, 8],
[ 1, 3, 9, 27],
[ 1, 5, 25, 125]])
Funciones de redondeo
x=[-4.9, -4.5, -4.1, -3.9, -3.5, -3.1, 3.1, 3.5, 3.9, 4.1, 4.5, 4.9]
A=numpy.random.random_integers(-10,10,(5,5))
A array([[ 6, 7, 0, -6, 8],
[ 0, 1, 6, -8, 4],
[ 0, -5, -4, 9, -1],
[ 5, -4, -9, 7, 7],
[ 6, 0, -1, 9, -6]])
Integración trapezoidal
Calcula la integración numérica por regla trapezoidal. Se puede
especificar el intervalo de muestreo en cada dimensión, el cual es 1
de forma predeterminada.
A=numpy.random.random_integers(-10,10,(5,5))
A array([[ 6, 7, 0, -6, 8],
[ 0, 1, 6, -8, 4],
[ 0, -5, -4, 9, -1],
[ 5, -4, -9, 7, 7],
[ 6, 0, -1, 9, -6]])
a=[2,3,5]; b=[7,11,13]
z1=list(map(complex,a,b))
z2=[complex(b[k],-a[k]) for k in range(len(a))]
z1 [(2+7j), (3+11j), (5+13j)]
z2 [(7-2j), (11-3j), (13-5j)]
numpy.inner(z1,z2) (224+301j)
numpy.vdot(z1,z2) -377j
numpy.inner(z1,z2) (-301+224j)
numpy.vdot(z1,z2) (377+0j)
Convolución de arreglos 1D
Puede ser "full", "same" o "valid"
x=[2,3,5]
y=[7,11,13,17]
numpy.convolve(x,y) array([ 14, 43, 94, 128, 116, 85]) ("full")
Correlación de arreglos 1D
Puede ser "valid", "same" o "full"
x=[2,3,5]
y=[7,11,13,17]
Correlación sólo con superposición completa de todos los elementos:
numpy.correlate(x,y) array([146, 112]) (modo "valid")
numpy.correlate(x,x) array([38]) (autocorrelación)
Covarianza
Produce la matriz de covarianza entre dos vectores, o entre
los vectores de un arreglo 2D.
A= [[-5, 2, -1], [3, -10, -10], [-10, -6, 4]]
x=[2,3,5]
y=[7,11,13]
numpy.cov(x,y) array([[ 2.33333333, 4.33333333],
[ 4.33333333, 9.33333333]])
numpy.cov(A) array([[ 12.33333333, -23.83333333, 9. ],
[-23.83333333, 56.33333333, -39. ],
[ 9. , -39. , 52. ]])
Media
M=numpy.array([2,3,5,7,11,13,17,19,23]).reshape(3,3)
Mediana
M=numpy.array([2,3,5,7,11,13,17,19,23]).reshape(3,3)
Desviación típica
M=numpy.array([2,3,5,7,11,13,17,19,23]).reshape(3,3)
Números complejos
z=[(1+2j),(3+4j)]
numpy.real(z) array([ 1., 3.]) (parte real)
numpy.imag(z) array([ 2., 4.]) (parte imaginaria)
numpy.abs(z) array([ 2.23606798, 5. ]) (magnitud)
numpy.angle(z) array([ 1.10714872, 0.92729522]) (fase, radianes)
Álgebra lineal
Solución de sistema de ecuaciones lineales compatibles
La matriz A debe ser cuadrada, no singular.
A=[[1,2,6],[1,1,2],[3,2,3]]
b=[1, 2, 3]
numpy.linalg.solve(A,b) array([ -5., 15., -4.])
valores propios:
valprop=numpy.linalg.eig(A)[0]
array([ 7.30761442, -2.36546502, 0.0578506 ])
numpy.linalg.eigh(A)[0]
array([ 3.23858793e-03, 4.81064379e+00, 6.41861176e+01]
numpy.linalg.eigvalsh(A)
array([ 3.23858793e-03, 4.81064379e+00, 6.41861176e+01]
Valores singulares:
numpy.linalg.svd(A)[1] array([ 9.508032 , 0.77286964])
Transformada de Fourier
http://docs.scipy.org/doc/numpy-1.10.0/reference/routines.fft.html
Transformadas en n dimensiones:
numpy.fft.rfftn(g) transformada de Fourier de función g real
numpy.fft.irfftn(G) transformada inversa que produce función real g
numpy.fft.fftn(g) transformada de Fourier de función real o
compleja
numpy.fft.ifftn(G) transformada inversa de Fourier real o compleja
y el espectro de fase:
Fase=numpy.angle(G)
Ejemplos:
g=[2, 3, 5, 7, 11, 13] (función real discreta)
Transformada inversa
numpy.fft.ifft(G)
array([ 2. +0.00000000e+00j, 3. -2.36847579e-15j, 5. +5.36588719e-
15j, 7. -5.92118946e-16j, 11. -1.81317351e-15j, 13. -5.92118946e-
16j])
Debería dar una función real. Aquí la parte imaginaria es causada por
imprecisión numérica en los cálculos, siendo el error del orden de
10-15
Ejemplos:
http://matplotlib.org/examples/
http://matplotlib.org/users/image_tutorial.html
http://matplotlib.org/examples/images_contours_and_fields/interpolati
on_methods.html
Matplotlib puede usarse en dos formas principales: una simple con una
sintaxis muy parecida a la de los gráficos en Octave/Matlab y otra en
un marco de programación orientada a objetos, no tan sencilla pero
mucho mas poderosa.
['__class__',
'__delattr__',
'__dict__',
'__dir__',
.........
'update',
'update_from',
'waitforbuttonpress',
'zorder']
Para la mayoría de gráficos, es suficiente el modo simple con las
funciones del submódulo pyplot:
# Ejemplos de graficación 2D
# Gráficos cartesianos
# FIGURA 1
# Crea figura 1
plt.figure(1)
# FIGURA 2
# Produce una segunda curva, derivada de la primera
yd=numpy.gradient(y)*5
# Crea figura 2
plt.figure(2)
Comentarios
plt.close("all")
Preventivamente cierra gráficos para evitar la posibilidad de
graficar sobre gráficos preexistentes.
x=numpy.arange(-5,5,0.1)
y=numpy.sinc(x)
Crea un arreglo de abcisas (x) y un arreglo de ordenadas (y)
obtenidas con la función seno cardinal. Se representará graficamente
esta función.
plt.figure(1)
Crea la ventana de la figura 1. Esta instrucción no es necesaria si
solo se fuese a graficar una figura.
plt.plot(x,y)
Grafica la figura simplemente con los datos de abcisas y ordenadas.
Automáticamente elije los límites del gráfico y agrega escalas a
ambos ejes.
Figura 1 Gráfico cartesiano resultante de graficación simple:
plt.plot(x,y) con los parámetros predeterminados.
plt.figure(2)
Crea nueva ventana gráfica o figura, identificada con número 2.
La identificación de figuras no es necesaria, excepto cuando se
tienen dos o mas figuras y el foco de atención del programa puede
cambiar alternativamente entre ellas.
ax=plt.gca()
Duplica en ax un objeto "axes" o escena en la figura 2. El objeto
axes es un widget gráfico que existe en un espacio de coordenadas (de
allí la clase "axes"). En una figura puede haber mas de un axes.
ax.set_axis_bgcolor((0.75,0.5,0.25))
Establece el color de fondo para la escena. El color es indicado
mediante una tupla de 3 o 4 números números, correspondientes a los
colores rojo, verde, azul y opcionalmente opacidad, en ese orden. Los
valores están normalizados al intervalo [0,1], e indican la
intensidad de cada color y la opacidad.
Un color con intensidad (0,0,0) corresponde a negro; (1,1,1) es
blanco intenso; (0.5,0.5,0.5) es gris, (1,0,0) es rojo intenso, etc.
El color es transparente si la opacidad es 0, y totalmente opaco si
es 1. Por ejemplo (1.0, 1.0, 0.0, 0.5) es amarillo semitransparente.
Si no se especifica, la opacidad es 1.0 de forma predeterminada.
Otra forma de indicar colores es mediante el nombre del color, según
la norma html:
http://www.w3schools.com/html/html_colornames.asp
curva1,=plt.plot(x,y,"ro-",label='sinc',linewidth=4,color=(0,0,1),markersiz
e=6,markerfacecolor=(1,0,0),markeredgecolor="g",markeredgewidth=2)
Grafica ordenadas (y) contra abcisas (x), con muchas opciones.
curva1 es el objeto gráfico producido por plt.plot. Este objeto tiene
numerosos métodos y por eso se asigna al duplicado o alias "curva1".
Notar que debe ponerse una coma después de curva1.
"ro-" significa: color de curva: rojo (r), símbolo marcador: círculos
(o), estilo de línea: contínua (-).
label='sinc': etiqueta identificadora de esta curva. Se utilizará
posteriormente para identificar las curvas en el gráfico.
linewidth=4: grosor de la línea en puntos
color=(0,0,1): color de la curva, usando una tupla de 3 números. En
este ejemplo indica azul intenso. Notar que el color de curva había
sido establecido previamente en rojo, pero esta opción la cambia a
azul.
markersize=6: tamaño de símbolos marcadores en puntos
markerfacecolor=(1,0,0): color de relleno de los símbolos marcadores
especificado con una tupla de 3 números. En este caso, color rojo
intenso.
markeredgecolor="g": color del borde de los símbolos marcadores.
Verde, especificado en este ejemplo mediante un solo carácter.
markeredgewidth=2: ancho del borde de los marcadores en puntos.
Colección de símbolos: http://matplotlib.org/api/markers_api.html
Estilo de líneas: http://matplotlib.org/api/lines_api.html
Colores: http://matplotlib.org/api/colors_api.html
plt.hold(True)
Asegura superposición de gráficos sucesivos en una misma ventana,
porque pudiera ocurrir que hubiese sido desactivado previamente.
plt.legend(handles=[curva1,curva2])
Grafica las etiquetas identificadoras de cada curva. En este ejemplo
se indica el orden de presentación con una lista. El texto de la
etiqueta es el mismo utilizado en las opciones "label" de plot; sin
embargo, es posible cambiarlos por otros especificándolos en una
lista como otro argumento de legend. También se puede especificar su
ubicación en el gráfico.
plt.xlim([-5.5,5.5])
plt.ylim([-0.8,1.2])
Especifica los límites de la escala del eje x y del eje y. Si no se
especificasen, serían elegidos por la función plot.
plt.grid(color="red")
Superpone una malla de líneas de coordenadas de color rojo
en el gráfico
Figura 2. Gráfico cartesiano de dos curvas realizado con plot y otras
funciones de matplotlib.pyplot, especificando algunos parámetros,
tales como tipo de línea, símbolos, colores, etiquetas, título,
límites de ejes coordenados.
# Ejemplos de graficación 2D
# Gráfico cartesiano cruzado
# Curvas de un conjunto de puntos abcisas y otro ordenadas
# Trata de simular los puntos de un gráfico densidad-velocidad P de rocas y
# sedimentos usando la fórmula empírica de Gardner
# rango de velocidades
t=numpy.arange(velmen,velmay,dvel)
# FIGURA 1
# Crea figura 1
plt.figure(1)
Comentarios
import numpy
Importa las funciones de arreglos numéricos
plt.ion()
plt.close("all")
t=numpy.arange(velmen,velmay,dvel)
Obtiene un rango de velocidades con la función "numpy.arange". Esta
función puede obtener rangos con números flotantes o enteros, a
diferencia de la básica de Python "range" que solo acepta enteros.
f=0.1*t**p*numpy.exp(-q*t)
Utiliza funciones Numpy que aceptan como argumento sucesiones de
números; es decir, se está usando la capacidad vectorial de Numpy.
s=f.cumsum()
Calcula una distribución acumulativa s, utilizando el método "cumsum"
del arreglo Numpy f creado
s=(s-s[0])/(s[-1]-s[0])
Realiza una normalización de los valores del arreglo s para que todos
estén comprendidos entre 0.0 y 1.0
funin=itp.interp1d(s,t)
Obtiene un objeto que representa una función de interpolación en 1D.
Utiliza la función interp1d del paquete Scipy.
El método de interpolación predeterminado es lineal; o sea, interpola
con rectas entre puntos sucesivos.
sa=numpy.random.random(np)
Utiliza la función random del módulo random del paquete Numpy para
obtener un arreglo sa de números aleatorios de distribución uniforme
en el intervalo [0,1)
v=funin(sa)
Utiliza la función interpoladora para obtener valores de velocidad
interpolados, para los valores aleatorios del arreglo sa
a=0.31+0.002*numpy.random.randn(np)
Utiliza la función randn para generar un arreglo de números
aleatorios de distribución normal, con media 0 y desviación típica 1.
Al multiplicarlos por 0.002, la desviación típica será ese número.
Este arreglo corresponde a valores de la constante que multiplica en
la relación densidad-velocidad de Gardner
m=0.25+numpy.random.randn(np)*0.005
Lo mismo para el exponente en la relación densidad-velocidad de
Gardner, pero con desviación típica 0.005
den=a*v**m
Calcula el arreglo de densidades con la fórmula de Gardner
plt.figure(1)
Crea la ventana de figura 1 (figura 3 de este instructivo)
scn=plt.gca()
Obtiene un alias para un objeto axes dentro de la primera figura.
scn.set_axis_bgcolor((0.55,0.27,0.14))
Otra forma de establecer el color de fondo de objetos axes, es con el
método set_axis_bgcolor.
El color indicado con la tupla (0.55,0.27,0.14) es equivalente a
especificarlo con la cadena: "#8B4512" del código html hexadecimal.
plt.plot(den,v,"^",linestyle="None",markersize=6,markerfacecolor=(1,1,0),ma
rkeredgecolor="g",markeredgewidth=2)
den, v son las sucesiones de coordenadas de los datos de densidad y
velocidad.
"^" indica que el símbolo marcador es un triángulo "derecho".
linestyle="None" se utiliza para evitar que los puntos sean unidos
mediante segmentos de recta y de esta forma lograr un gráfico de
puntos dispersos. Lo mismo se logra usando la función scatter.
markersize=6 indica tamaño del símbolo marcador en puntos
markerfacecolor=(1,1,0) indica color amarillo de relleno del marcador
markeredgecolor="g" indica borde de marcador de color verde
markeredgewidth=2 indica ancho de borde de marcador igual a 2 puntos
plt.xlim([1.0,3.5])
plt.ylim([0.0,7500.0])
plt.xlabel(r'$\mathrm{\rho \ (g/cm^3)}$',fontsize=18,
color=(0.12,0.25,0.50))
Pone la identificación del eje x.
r'$\mathrm{\rho \ (g/cm^3)}$':
la r antes de la comilla indica modo literal, para que Python
interprete correctamente la cadena entre comillas
El texto entre signos dólar $ contiene instrucciones LaTeX:
\mathrm indica que el texto entre llaves debe mostrarse con tipo de
letra Roman
\rho es la letra griega ro
\ seguido de espacio en blanco, inserta espacio en blanco
^3 supraíndice 3
fontsize indica el tamaño de letra, y color el color de letra
plt.ylabel(r'$\mathrm{Velocidad \
(m/s)}$',fontsize=18,color=(0.12,0.25,0.50))
Igual comentario que xlabel, para el eje y
plt.title("NAFE-DRAKE SIMULADO",fontsize=18,
color="blue",weight="bold",family="Bitstream Vera Sans")
plt.grid(color="white")
Figura 3. Gráfico de puntos dispersos simulando un gráfico densidad-
velocidad de Nafe-Drake. Se utilizó la función plot de Pyplot, y se
anuló la unión de puntos mediante rectas estableciendo la propiedad
linestyle="None". El mismo resultado se puede lograr con la función
scatter de Pyplot.
# Ejemplo de gráfico bilogarítmico
# Grafica las resistividades aparentes de un sondeo eléctrico vertical
# Schlumberger
# importa las funciones de interpolación del paquete Scipy, con alias itp
import scipy.interpolate as itp
# FIGURA 1
# Crea figura 1
plt.figure(1)
Comentarios nuevos
ab2=[1, 1.39, 1.93, 2.68, 3.73, 5.18, 7.2, 10, 13.9, 19.3, 26.8, 37.3,
51.8, 72, 100, 139, 193, 268, 373, 518, 720, 1000, 1390]
roa=[85.2, 69.99, 54.99, 25.97, 11.99, 5.81, 4.39, 4.05, 4.08, 4.25, 4.6,
5.52, 7.04, 9.48, 13.15, 17.73, 25.28, 34.43, 48.23, 65.63, 90.04, 118.14,
168.39]
Define directamente dos listas de datos, una de distancias AB/2 (ab2)
y otra de resistividades aparentes medidas (roa)
xlm=plt.xlim()
En este ejemplo, la función xlim, sin argumentos, devuelve los
límites del eje x y los guarda en la lista xlm
plt.ylabel(r'$\mathrm{Resistividad\ aparente\
(\Omega.m)}$',fontsize=18,color="black")
En la etiqueta del eje y, la letra griega omega mayúscula se indica
mediante \Omega; es decir: comenzando el nombre de la letra con una
mayúscula.
# FIGURA 1
# Crea figura 1
plt.figure(1)
plt.axes(polar=True,axisbg=(0.75,0.5,0.25))
# otra forma:
#plt.axes(projection="polar",axisbg=(0.75,0.5,0.25))
# otra forma:
# plt.gca(projection="polar",axisbg="#2F4F4F")
# plt.plot(x,abs(y))
# otra forma:
# plt.polar(x,abs(y))
# FIGURA 2
# Curva polar en gráfico cartesiano
plt.figure(2)
Comentarios nuevos
plt.axes(polar=True,axisbg=(0.75,0.5,0.25))
Aplica la opción de gráfico polar al objeto axes de esta figura.
También establece el color de fondo.
plt.plot(y*numpy.cos(x),y*numpy.sin(x),linestyle=":",color="y",linewidth="3
",marker="*",markerfacecolor="w",markersize=12)
En la figura 6, se grafica la misma curva: el gráfico es cartesiano,
pero la curva es polar.
Esto se logra haciendo la transformación de coordenadas polares a
cartesianas: se multiplica la magnitud por el coseno y el seno del
ángulo para obtener las coordenadas cartesianas.
El marcador indicado por el asterisco (*) será graficado como una
estrella. El estilo de línea selecionado es punteado (:)
# Importa las funciones de interpolación del paquete Scipy con alias itp
import scipy.interpolate as itp
# rango de velocidades
t=numpy.arange(velmen,velmay,dvel)
# calcula velocidades
f=0.1*t**p*numpy.exp(-q*t)
# función acumulativa
# Observación: la función de velocidad utilizada tiene integral elemental.
# (Bronshtein et al. (2005), p. 1051, fórmulas 447-450)
# Sin embargo, si se reemplaza por otra función, puede que no tenga
# integral elemental.
s=f.cumsum()
# normaliza a [0,1]
s=(s-s[0])/(s[-1]-s[0])
# obtiene la función interpoladora (funin) con interpolación lineal
funin=itp.interp1d(s,t)
# FIGURA 1
# Histograma
# crea figura
plt.figure()
# FIGURA 2
# Diagrama de caja y violín
# Crea figura
fig2=plt.figure()
Comentarios nuevos
nbarras=numpy.ceil((velmay-velmen)/250.)
Utiliza la función ceil para redondear un número hacia el entero
inmediato superior. Aquí se utiliza para calcular un número de barras
para el histograma.
scn2.boxplot(vela,showmeans=True,notch=True,boxprops={"linewidth":2},whiske
rprops={"linewidth":3},capprops={"linewidth":2},medianprops={"linewidth":3}
,labels=" ")
Grafica un diagrama estadístico de caja utilizando el método boxplot
del objeto axes scn2 (figura 8).
Argumento obligatorio: el arreglo de datos (vela)
Argumentos opcionales:
showmeans=True indica que debe representar la media o medias (el
arreglo de datos puede tener múltiples columnas de datos, en cuyo
caso se graficarán igual cantidad de diagramas de caja con sus
respectivas medias). El símbolo predeterminado es un pequeño
cuadrado.
notch=True indica que debe graficar el intervalo de confianza del
estimado de la mediana mediante muescas en la caja. De forma
predeterminada es el intervalo de confianza del 95%, pero esto se
puede cambiar.
boxprops={"linewidth":2} el contenido entre llaves es un diccionario
de propiedades de la caja: establece el grosor de las líneas que
limitan la caja en 2 puntos.
wiskerprops={"linewidth":3} diccionario donde se establece el grosor
de las líneas punteadas que salen de la caja en 3 puntos
capsprops={"linewidth":3} diccionario donde se establece el grosor de
las líneas transversales al extremo de las líneas punteadas en 2
puntos.
medianprops={"linewidth":3} diccionario donde se establece el grosor
de la línea de la mediana en 3 puntos.
labels=" " establece como identificador de cajas un espacio en
blanco. En este ejemplo se hace por estética, porque se graficará una
sola caja. La identificación tiene sentido cuando se muestran
múltiples cajas.
violin=scn2.violinplot(vela,showmeans=True,showmedians=True)
Utiliza el método violinplot del objeto axes scn2 para graficar un
diagrama de violín. Notar que lo hace en la misma ventana del gráfico
de caja. Pudo haberse hecho en un gráfico aparte, pero resulta mas
ilustrativo superponer las dos formas de representar los datos
estadísticos.
violinplot devuelve un diccionario de objetos gráficos. Se respalda
en "violin" porque se va necesitar a continuación.
De forma predeterminada, el gráfico de violín representa un estimado
de la función de distribución de la población en base a una muestra.
https://en.wikipedia.org/wiki/Violin_plot
Se puede seleccionar la técnica estadística utilizada para realizar
tal estimado.
https://en.wikipedia.org/wiki/Kernel_density_estimation
LineCollection.set_color(violin["cmeans"],"blue")
violinplot no permite establecer las propiedades individuales de los
objetos gráficos que componen el diagrama; por ejemplo, el color.
Como consecuencia, la línea que representa la media tiene el mismo
color que la línea que representa la mediana, haciendo difícil
identificar cual es cual.
La función LineCollection.set_color se utiliza para cambiar el color
a la línea de la media utilizando la clave cmeans en el diccionario
de objetos violin. Se establece en color azul, para diferenciarla de
la línea de la mediana que está en color rojo.
plt.setp(scn2,xticks=[])
La función setp se puede utilizar para poner o cambiar propiedades de
objetos gráficos. En este ejemplo se utiliza para eliminar las marcas
de identificación de gráficos violin, por el procedimiento de pasarle
una lista vacía. Se hace por estética, ya que sólo hay un gráfico.
Figura 7. Histograma de barras elaborado con el método hist de
Pyplot.
Figura 8. Diagrama de caja y diagrama de violín superpuestos en una
misma figura. El diagrama de caja fue realizado con el método boxplot
de un objeto axes, y el diagrama de violín con el método violinplot
del mismo objeto.
La media está indicada por el pequeño cuadro rojo en medio de la
línea azul. La mediana está en la línea roja entre las muescas de la
caja.
GRÁFICOS DE MAPAS
def cotasp77(xx,yy,c):
# dados los arreglos de coordenadas x (xx), coordenadas y (yy) y
coeficientes c,
# calcula cotas zz con un polinomio de grado máximo 7 en x,y. Es decir, la
suma
# de la potencia de x mas la potencia de y no excede 7.
# Después se divide entre xx**8 + yy**8 + 1 para hacer que las cotas
tiendan
# a cero en el infinito.
# cálculo de potencias de x y de y
xx1=xx
xx2=xx*xx
xx3=xx2*xx
xx4=xx3*xx
xx5=xx4*xx
xx6=xx5*xx
xx7=xx6*xx
xx8=xx7*xx
yy1=yy
yy2=yy*yy
yy3=yy2*yy
yy4=yy3*yy
yy5=yy4*yy
yy6=yy5*yy
yy7=yy6*yy
yy8=yy7*yy
# cálculo de las cotas z=P77(x,y)
zz= c[0]\
+c[1]*xx1+c[2]*yy1\
+c[3]*xx2+c[4]*xx1*yy1+c[5]*yy2\
+c[6]*xx3+c[7]*xx2*yy1+c[8]*xx1*yy2+c[9]*yy3\
+c[10]*xx4+c[11]*xx3*yy1+c[12]*xx2*yy2+c[13]*xx1*yy3+c[14]*yy4\
+c[15]*xx5+c[16]*xx4*yy1+c[17]*xx3*yy2\
+c[18]*xx2*yy3+c[19]*xx1*yy4+c[20]*yy5\
+c[21]*xx6+c[22]*xx5*yy1+c[23]*xx4*yy2+c[24]*xx3*yy3\
+c[25]*xx2*yy4+c[26]*xx1*yy5+c[27]*yy6\
+c[28]*xx7+c[29]*xx6*yy1+c[30]*xx5*yy2+c[31]*xx4*yy3\
+c[32]*xx3*yy4+c[33]*xx2*yy5+c[34]*xx1*yy6+c[35]*yy7
# Se divide entre potencias octavas para reducir magnitudes hacia los
bordes
# El +1 es para evitar división entre 0 cuando xx8=yy8=0
zz=zz/(xx8+yy8+1)
# Devuelve el resultado zz
return(zz)
#--------------------------------------------------------------------------
c=numpy.random.random_integers(-10,10,36)
# intervalo de contornos
inter=numpy.round((2*mami)/20)
#
# FIGURA 1
# Mapa de contornos creados por triangulación de puntos de cota
#FIGURA 3
# Coordenadas x,y en mallado regular
# calcula las cotas ZZ en los puntos (XX,YY) del mallado con la función
cotasp77
ZZ=cotasp77(XX,YY,c)
plt.colorbar(idg).set_label("Cota (m)")
Comentarios
def cotasp77(xx,yy,c):
Define una función de usuario llamada cotasp77, con tres argumentos
obligatorios
xx=(xs-xi)*numpy.random.random_sample((nalea,))+xi
yy=(xs-xi)*numpy.random.random_sample((nalea,))+xi
Obtiene abcisas (xx) y ordenadas (yy) de puntos aleatorios de
distribución uniforme usando la función random_samples. Un sinónimo
de esta función es "random".
En el argumento, el número de puntos aletorios (nalea) se especifica
en una tupla. Como se trata de un arreglo de una sola dimensión, debe
ponerse una coma en la tupla.
Los puntos aleatorios quedan distribuidos uniformente en el intervalo
[xi,xs]
zz=cotasp77(xx,yy,c)
Utiliza la función de usuario cotasp77 para obtener valores zz en los
puntos aleatorios (xx,yy)
El arreglo c contiene los coeficientes de un polinomio 2D de grado
máximo 7 en x,y
mami=numpy.ceil(max(abs(zz)))
Determina el máximo absoluto de las zz calculadas, redondeando hacia
el entero mayor mas cercano
inter=numpy.round((2*mami)/20)
Calcula el intervalo entre contornos, para 21 contornos. La función
numpy.round redondea hacia el entero mas cercano.
contornos=numpy.arange(ini,fin+inter,inter)
Obtiene un arreglo con los valores de los contornos usando la función
arange de Numpy.
Notar que para el límite de la sucesión geométrica se usó fin+inter,
con la finalidad de que incluya el valor de "fin" en el arreglo.
idf=plt.tricontour(xx,yy,zz,contornos,linewidths=2,cmap="seismic")
Grafica mapa de contornos con la función tricontour (figura 9).
Tricontour crea triángulos bajo la condición de Delaunay con los
puntos suministrados, los cuales utiliza para calcular los contornos.
idf es el identificador del objeto gráfico que devuelve tricontour.
Argumentos obligatorios:
xx, yy, zz: coordenadas 3D de los puntos
contornos: arreglo con los valores de los contornos a graficar
Argumentos opcionales:
cmap="seismic" elige la paleta de colores denominada "seismic" cuyo
rango es desde azul hasta rojo, con blanco en la mitad.
plt.clabel(idf,fontsize=10,fmt="%1.1f")
Pone etiquetas a los contornos (donde sea posible hacerlo).
En los argumentos, idf identifica el objeto que contiene los
contornos.
fontsize=10 es el tamaño de letra de las etiquetas en puntos
fmt="%1.1f" indica el formato del número que indica la cota. Al menos
1 dígito en la parte entera, y 1 decimal en la parte fraccionaria,
número en punto flotante
plt.colorbar().set_label("Cota (m)")
Agrega una escala de colores al gráfico. Las cotas serán
identificadas por líneas de diferente color. Además le pone una
identificación a la escala.
idg=plt.tricontourf(xx,yy,zz,contornos,cmap="bwr")
Grafica un mapa de contornos con relleno de color, usando la función
tricontourf (figura 10). Como paleta de colores utiliza una
denomidada "bwr" que significa: azul blanco rojo. Similar a la paleta
"seismic".
plt.colorbar(idg).set_label("Cota (m)")
Agrega escala de colores al mapa. Además identifica las unidades.
idf=plt.tricontour(xx,yy,zz,[0],linewiths=2,colors=[(0.461880,0.461880,0.46
1880)])
Grafica la línea de contorno zz=0 sobre el gráfico de tricontourf.
Esto ayuda visualmente a distinguir el límite entre cotas positivas y
negativas. El color especificado es gris, de la misma intensidad que
el color central en la paleta denominada "viridis".
Si existiesen mas líneas de cota, sería posible especificar el grosor
y color de cada línea individualmente pasando arreglos en las
opciones linewidts y colors (por eso en plural).
plt.clabel(idf,fontsize=10,fmt="%1.1f",colors="black")
Pone la etiqueta de cota a la única línea de cota
x=numpy.arange(xi,xs+dx,dx,dtype=float)
Crea un arreglo para coordenadas, con valor inicial xi y valor final
xs, a intervalos dx.
Se utiliza xs+dx para que incluya xs en el rango.
XX,YY=numpy.meshgrid(x,x)
Crea arreglos de coordenadas de puntos en un mallado regular.
En este ejemplo el mallado es cuadrado, pero pudiera ser rectangular.
Si las coordenadas y fuesen distintas a las x se utilizaría:
XX,YY=numpy.meshgrid(x,y); pero en este ejemplo y=x.
El arreglo XX contiene solo las coordenadas x de los puntos del
mallado, y el arreglo YY solo las coordenadas y.
def cotasp77(xx,yy,c):
# dados los arreglos de coordenadas x (xx), coordenadas y (yy) y
coeficientes c,
# calcula cotas zz con un polinomio de grado máximo 7 en x,y. Es decir, la
suma
# de la potencia de x mas la potencia de y no excede 7.
# Después se divide entre xx**8 + yy**8 + 1 para hacer que las cotas
tiendan
# a cero en el infinito.
# cálculo de potencias de x y de y
# Este método es mas rápido que utilizar la función pow
# pero el resultado puede ser menos preciso, excepto si
# todas las cantidades son enteros
xx1=xx
xx2=xx*xx
xx3=xx2*xx
xx4=xx3*xx
xx5=xx4*xx
xx6=xx5*xx
xx7=xx6*xx
xx8=xx7*xx
yy1=yy
yy2=yy*yy
yy3=yy2*yy
yy4=yy3*yy
yy5=yy4*yy
yy6=yy5*yy
yy7=yy6*yy
yy8=yy7*yy
# cálculo de las cotas z=P77(x,y)
zz= c[0]\
+c[1]*xx1+c[2]*yy1\
+c[3]*xx2+c[4]*xx1*yy1+c[5]*yy2\
+c[6]*xx3+c[7]*xx2*yy1+c[8]*xx1*yy2+c[9]*yy3\
+c[10]*xx4+c[11]*xx3*yy1+c[12]*xx2*yy2+c[13]*xx1*yy3+c[14]*yy4\
+c[15]*xx5+c[16]*xx4*yy1+c[17]*xx3*yy2\
+c[18]*xx2*yy3+c[19]*xx1*yy4+c[20]*yy5\
+c[21]*xx6+c[22]*xx5*yy1+c[23]*xx4*yy2+c[24]*xx3*yy3\
+c[25]*xx2*yy4+c[26]*xx1*yy5+c[27]*yy6\
+c[28]*xx7+c[29]*xx6*yy1+c[30]*xx5*yy2+c[31]*xx4*yy3\
+c[32]*xx3*yy4+c[33]*xx2*yy5+c[34]*xx1*yy6+c[35]*yy7
# Se divide entre potencias octavas para reducir magnitudes hacia los
bordes
# El +1 es para evitar división entre 0 cuando xx8=yy8=0
zz=zz/(xx8+yy8+1)
return(zz)
#--------------------------------------------------------------------------
c=numpy.random.random_integers(-10,10,36)
# intervalo de contornos
inter=numpy.round((2*mami)/20)
#
# FIGURA 1
# Puntos dispersos en 3D
#
# FIGURA 2
# Superficie en 3D con facetas triangulares
#
# FIGURA 3
# Superficie en 3D con mallado de puntos
#
# FIGURA 4
# Mallado de superficie en 3D sin relleno con
# líneas de contorno y proyección sobre el
# plano xy
#
# FIGURA 5
# Líneas en 3D con plot3D
Comentarios
import time
Las funciones del paquete time se usan para aplicaciones donde se
necesite conteo de tiempo
t0=time.time()
Toma el tiempo inicial según el reloj de la máquina, en segundos.
scn.scatter(xx,yy,zz,marker=".",s=0.1)
El método scatter del objeto scn grafica puntos dispersos en 3D
(figura 12).
Requiere como argumentos obligatorios 3 arreglos con las coordenadas
x,y,z
La opción marker="." indica que los puntos en el espacio serán
representados con símbolos marcadores de puntos
La opción s=0.1 indica el tamaño de los marcadores.
scn.plot_trisurf(xx,yy,zz,cmap=cm.terrain,linewidth=0,vmax=fin, vmin=ini)
El método plot_trisurf del objeto axes scn, grafica una superficie de
facetas triangulares en 3D (figura 13).
Los argumentos obligatorios son arreglos con las coordenadas x,y,z de
los puntos.
cmap=cm.terrain: indica una paleta de colores
linewidth=0: el grosor de las líneas de las aristas de los
triángulos. Se puso espesor 0 para que no las grafique.
vmax=fin, vmin=ini: valores máximos y mínimos de coordenada z en el
gráfico. Serán utilizados también para establecer los límites en la
escala de colores.
Este gráfico es útil si los puntos pertenecen a una superficie en 3D.
ids=scn.contour3D(XX,YY,ZZ,contornos,cmap=cm.jet)
El método contour3D del objeto axes scn dibuja contornos de cota en
espacio 3D. Sólo dibuja los contornos en el espacio. Resulta mas útil
si se dibujan en el mismo gráfico que producen plot_trisurf,
plot_surface o plot_wireframe, como en este ejemplo (figura 15).
Argumentos obligatorios: arreglos con las coordenadas x,y,z de los
puntos del mallado y un arreglo con los valores z de los contornos
deseados.
cmap=cm.jet: utilizar la paleta de colores denominada "jet"
zinf=scn.get_zbound()[0]
El método gez_zbound del objeto axes scn obtiene una lista con los
límites z (inferior y superior) del gráfico. En este caso se toma
solo el límite inferior.
scn.contourf3D(XX,YY,ZZ,contornos,cmap=cm.jet,zdir="z",offset=zinf)
El método contourf3D produce contornos de cota z, rellenos en 3D.
Visualmente semejan bandas horizontales en el espacio. Resultan de
mayor utilidad si se proyectan sobre uno o varios planos. En este
ejemplo se proyectan sobre un plano xy de cota z=zinf (figura 15).
Los argumentos obligatorios son arreglos con los valores x,y,z de los
puntos del mallado y un arreglo con los valores z de los contornos
deseados.
cmap=cm.jet: utilizar la paleta de colores denominada "jet"
zdir="z": dirección de proyección de las bandas de contornos de cota
offset=zinf: cota del plano xy sobre el que se proyectan los
contornos.
nan=float("nan")
Asigna a una variable llamada nan un tipo de objeto denominado "nan",
de "not a number", que se utiliza por ejemplo para designar
resultados que no están definidos, tal como la división 0/0
superf=scn.plot3D([1,4,3,1,nan,1,4,3,1],[2,3,5,2,nan,2,3,5,2],[6,3,5,6,nan,
0,0,0,0,],color="blue")
El método plot3D del objeto axes scn grafica líneas entre puntos
sucesivos en 2D o en 3D (figura 16).
Como argumentos obligatorios se pueden dar arreglos con las
coordenadas x,y para gráficos 2D, o arreglos x,y,z para gráficos en
3D.
En este ejemplo se dan 3 arreglos con las coordenadas x,y,z
respectivamente.
En los arreglos se incluyó un punto de coordenadas (nan,nan,nan) con
el objeto de interrumpir el trazado de rectas entre puntos sucesivos.
Esto es útil para graficar líneas discontínuas. De esta forma se pudo
lograr dibujar dos triángulos separados.
print("tiempo=",time.time()-t0,"s")
Imprime el tiempo total (este programa+otros programa+sistema
operativo) utilizado desde inicio del programa hasta su terminación.
La opción "s" indica que el tiempo debe estar expresado en segundos.
Figura 12. Gráfico 3D de puntos dispersos elaborado por el método
scatter de un objeto axes.
Figura 13. Gráfico de superficie 3D de facetas triangulares elaborado
por el método plot_trisurf de un objeto axes.
Figura 14. Gráfico de superficie 3D en un mallado regular, elaborado
por el método plot_surface de un objeto axes.
Figura 15. Gráfico de líneas de mallado de una superficie 3D,
elaborado por el método plot_wireframe de un objeto axes.
Superpuestas a la malla están líneas de contornos, elaboradas por el
método contour3D del mismo objeto axes.
Proyectados en un plano horizontal están los contornos de cotas
rellenos, elaboradas por el método contourf3D del objeto axes.
Figura 16. Gráfico de líneas en 3D elaborado por el método plot3D de
un objeto axes. Los triángulos representados están desconectados,
debido a que se incluyó un punto nan en los arreglos de coordenadas.
Superposición de gráficos
De forma predeterminada en matplotlib los gráficos se superponen en
una ventana abierta.
Para desactivar esta característica, tal que cada vez que se grafique
se borre el gráfico previo usar:
plt.hold(False)
Depuración postmortem.
Se puede invocar cuando se interrumpe un programa con Ctrl I, o
cuando ocurre un error que detiene el programa, por ejemplo división
entre cero.
Entonces se puede activar la depuración postmortem con:
En el menú principal de IEP: Consola Postmortem: Depurar desde el
último tracebak
O bién en el shell: db start
Sin embargo, aquí no se activan los íconos de depuración. Sólo está
activa la pila de llamadas y se enciende el indicador de posición
guión verde en la columna de numeración de líneas del editor. Esto es
una ayuda visual para determinar donde ocurrió el error.
MÓDULO MPMATH
Para precisión arbitraria con números punto flotante
Instalación
Tipos de números
mpmath tiene objetos para flotantes y complejos que se indican como
mpf y mpc, respectivamente.
mpmath.mpmathify(3) mpf('3.0')
mpmath.mpmathify(0.1) mpf('0.10000000000000001')
mpmath.mpmathify("0.1") mpf('0.10000000000000001')
mpmath.mpmatthfy(3+4j) mpc(real='3.0', imag='4.0')
Estableciendo la precisión
Se puede establecer especificando en dígitos decimales o en bits de
la mantisa.
Si se especifica en uno, mpmath ajusta el otro.
La relación es: bits=decimales*log2(10), (aprox. 3.3219)
Ejemplo:
mpmath.mp.dps=30 (en dígitos decimales)
mpmath.mp.prec=100 (en bits)
mpmath.mp.dps=88
Forma incorrecta:
mpmath.mpf(3.2) mpf('3.20000000000000017763568394')
Formas correctas:
mpmath.mpf("3.2") mpf('3.200000000000000000000000003')
mpmath.mpf(str(3.2)) mpf('3.200000000000000000000000003')
Forma incorrecta:
x=3.2
mpmath.mpf(x) mpf('3.20000000000000017763568394')
Forma correcta:
x=3.2
mpmath.mpf(str(x)) mpf('3.200000000000000000000000003')
Ejemplo:
Forma incorrecta:
x=3.2
mpmath.mpf(str(x))*x mpf('10.24000000000000056843418863')
Forma correcta:
x=3.2
mpmath.mpf(str(x))* mpmath.mpf(str(x))
mpf('10.24000000000000000000000001')
arreglonp*mpmath.mpf("3.2")
realiza la multiplicación a precisión completa de los elementos del
arreglo por el escalar. El resultado es otro arreglo de numpy con
elementos que son objetos mpf.
Ejemplo:
Calcular con precisión de mpmath el coseno de los elementos de un
arreglo numpy que contiene objetos mpf:
list(map(mpmath.cos,listanp)) produce lista de objetos mpf
Gráficos
Son gráficos muy básicos, solo para tener una vista rápida de la
forma de las funciones.
Produce tres tipos de gráficos simples: de curvas, de números
complejos y superficies 3D.
Requiere que esté instalado matplotlib.
Curvas
Forma genérica:
mpmath.plot(funcion, xlim=[xi,xs], ylim=[yi,ys], points=n,
singularities=[s1,s2,...]) (existen mas argumentos)
Ejemplo:
plot(log) grafica la función logaritmo en el intervalo [-5,5].
En las abcisas negativas la función es compleja,
entonces representa la parte real como curva segmentada
y la imaginaria como curva aserrada
MÓDULO GMPY2
Aritmética y funciones de precisión arbitraria.
El módulo mpmath puede usar enteros de gmpy, que hace las operaciones
mas rápidas, según http://mpmath.org/doc/current/setup.html
Páginas de red:
Ejemplos breves de uso:
https://gmpy2.readthedocs.org/en/latest/overview.html
https://code.google.com/p/gmpy/wiki/UsingGmpy2AndMpfr
Como instalar:
https://code.google.com/p/gmpy/wiki/InstallingGmpy2
Documentación:
https://gmpy2.readthedocs.org/en/latest/index.html
Ejemplos:
entero= gmpy2.mpz("1234567890123456789012345678901234567890")
entero mpz(1234567890123456789012345678901234567890)
flotante= gmpy2.mpfr("1234567890123456789012345678901234567890")
flotante mpfr('1.234567890123456789012345678901e+39',100)
flotante= gmpy2.mpfr("3.141592")
flotante mpfr(' 3.1415920000000000000000000000003',100)
flotante= gmpy2.mpfr(3.141592)
flotante mpfr(' 3.1415920000000001621742740098853',100)
racional= gmpy2.mpq(str(3.141592))
racional mpq(392699,125000)
racional= gmpy2.mpq(3.141592)
racional mpq(3537118140137533,1125899906842624)
complejo=gmpy2.mpc(3+5j)
complejo mpc('3.0+5.0j',(100,100))
gmpy2.mpz(2)/gmpy2.mpz(3)
mpfr('0.66666666666666666666666666666693',100)
Aquí Python reconoce que los números son objetos clase mpz y para el
operador de división (que es un método) utiliza el de gmpy2 y no el
interno predeterminado.
Si se desea que realice la operación división entera, usar el
operador //:
gmpy2.mpz(2)//gmpy2.mpz(3) mpz(0)
gmpy2.mpz(2)+gmpy2.mpz(3) mpz(5)
gmpy2.mpz(2)**gmpy2.mpz(3) mpz(8)
Por ejemplo:
gmpy2.mul(2,3) mpz(6)
Números complejos
Se convierten y declaran con la función mpc:
gmpy2.sqrt(gmpy2.mpc(-1+1j))
mpc('0.45508986056222734130435775782255+1.098684113467809966039801195
2408j',(100,100))
gmpy2.sqrt(gmpy2.mpfr(-4)) mpfr('nan')
gmpy2.sqrt(gmpy2.mpc(-4)) mpc('0.0+2.0j',(100,100))
pow(gmpy2.mpc(-4),0.5) )) mpc('0.0+2.0j',(100,100))