Intro Py
Intro Py
A. Garcimartín
A. Garcimartín
ISBN 978-84-8081-728-8
Distribución
Esta obra se puede distribuir libremente, utilizar extractos, adaptarla, o incluirla en otras obras, incluso con fines
comerciales, siempre que se cite el origen y se atribuya al autor. Si se realizan cambios, así debe indicarse.
Se confiere a esta obra la Licencia Creative Commons Atribución 4.0 Internacional. Para ver una copia de esta
licencia, visite http://creativecommons.org/licenses/by/4.0/.
This work is licensed under the Creative Commons Attribution 4.0 International License. To view a copy of this
license, visit http://creativecommons.org/licenses/by/4.0/.
1
Python básico
Este documento contiene un resumen personal del lenguaje Python. Los comandos de Python se mues-
tran con su salida correspondiente tal como aparecen en una consola interactiva, con el input indicado
así: >>> , o bien en una “celda” de Jupyter Notebook con el input sombreado.
1. Tipos de variables
Los tipos de variables más usados son: números enteros (int), números reales (float) y ca-
denas de caracteres (str). Esas palabras clave se emplean además para convertir de un tipo a
otro.
>>> n1 = 3 # Python elige automáticamente el tipo de variable
>>> type(n1)
<class 'int'>
>>> x1 = 3.1416
>>> type(x1)
<class 'float'>
>>> s1 = '7 de julio' # las comillas simples ' y dobles " son equivalentes
>>> type(s1)
<class 'str'>
Para mostrar en pantalla se emplea la función print, en cuya sintaxis se pueden incluir refe-
rencias a variables que se rellenan según su valor.
>>> f1 = float(n1)
>>> s2 = str(n1)
>>> print(f1)
3.0
>>> type(f1)
<class 'float'>
>>> print(s2)
3
>>> type(s2)
<class 'str'>
>>> nombre = "Zendaya"
>>> edad = 25
>>> print(nombre, 'tiene', edad, "años")
Zendaya tiene 25 años
>>> print("{} tiene {} años".format(nombre,edad))
Zendaya tiene 25 años
>>> print(f'{nombre} tiene {edad} años') # nótese la f al principio
Zendaya tiene 25 años
2
2. Operadores básicos
2.1. Operaciones algebraicas
Operador Significado Ejemplo
+ suma x+y+2
- resta x-y-2
* multiplicación x*y
/ división x/y
% resto (de la división) x %y
** potencia x**y (daría x y )
Observación.- Python es un lenguaje orientado a objeto. Eso quiere decir que los operadores
pueden actuar de manera diferente según el método definido para cada objeto.
2.3. Comparaciones
Las siguientes operaciones dan como resultado una variable lógica que solo puede tomar los
valores True o False.
Operador Significado Ejemplo
== igual que x == y
!= distinto a x != y
< menor que x < y
<= menor o igual que x <= y
> mayor que x > y
>= mayor o igual que x >= y
>>> 5 >= 6
False
>>> 5 != 6
True
>>> (5 >= 6) or (5 != 6)
3
True
>>> v = [1,2,3] # definición de v (una lista; ver más adelante)
>>> 1 in v # ¿está 1 entre los elementos de v?
True
>>> 5 in v # ¿está el 5?
False
>>> (5 in v) or (1 in v) # ¿está el 5 o el 1?
True
>>> (5 in v) and (1 in v) # ¿están el 5 y el 1?
False
>>> (5 in v) or not(6 in v) # ¿está el 5 o falta (no está) el 6?
True
4
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
Los diccionarios son pares clave / valor; si se solicita la clave, devuelve el valor.
>>> Contactos = {
... "Cara Delevigne":"310-421-0894",
... "Jennifer Lopez":"305-690-0379",
... "Hugh Jackman":"212-596-7998"}
>>> type(Contactos)
<class 'dict'>
>>> Tel_JLo = Contactos["Jennifer Lopez"]
>>> print(Tel_JLo)
305-690-0379
Indices y secciones
Para obtener un subconjunto contiguo de los elementos de una lista se emplea la sintaxis
lista[inicio:fin:paso], donde el índice inicio se incluye pero el fin no. Hay distintas va-
riantes (consúltese Understanding Slicing en stackoverflow):
A los elementos de una lista contenida dentro de otra lista se accede mediante dos índices:
5
>>> pecera1 = ['betta','escalar','guppy']
>>> pecera2 = ['cebra','neón']
>>> acuario = [pecera1,pecera2]
>>> pecera1[0]
'betta'
>>> acuario[0][2]
'guppy'
>>> acuario[1][0]
'cebra'
Menú desplegable que aparece cuando se escribe el nombre de un objeto, seguido de un punto, al apretar
la tecla Tabulador. En este caso, impares es una lista.
6
Métodos para listas
Operador Significado
append() añadir elemento
extend() concatenar otra lista
insert() insertar
remove() quitar un valor de la lista
pop() quita el último elemento
count() cuántas veces sale un valor
index() lugar donde aparece por primera vez un valor
sort() ordenar (redefine la lista, ordenándola)
reverse() da la vuelta a la lista (y la deja así)
copy() crea una copia de la lista
clear() borra los elementos de la lista (pero no la lista)
Los métodos se ejecutan con la sintaxis objeto.método(). Ejemplo:
7
5. Control del flujo: ramificación
- la indentación es parte de la sintaxis: lo que se ejecuta condicionalmene es lo que está
indentado.
- no se usan paréntesis; las condiciones deben evaluarse en True o False.
- se acaba la condición con :
if condición A :
comandos I
elif condición B :
comandos II
elif condición C :
...
else :
comandos IV
Si se cumple la condición A, se ejecutan los comandos I ; en caso contrario (es decir, no se cumple
A), si se cumple la condición B, se ejecutan los comandos II ; en caso contrario (no se cumple ni
A ni B), si se cumple C, etcétera, y si no se cumple ninguna de las condiciones (A, B, C, ...) se
ejecuntan los comandos IV.
La secuencia debe ser una colección secuenciable: una lista, una tupla, un set, un diccionario o
incluso una cadena de caracteres. La variable tomará sucesivamente cada uno de los posibles
valores de la colección. Ejemplos:
8
[1]: impares = [1,3,5]
for n in impares:
print(n)
1
3
5
a
i
u
e
o
9
[2]: fibo = [1,1]
num_terms = 17 # número de términos
contador = 2
while contador < num_terms:
fibo.append(fibo[contador-1]+fibo[contador-2])
contador = contador+1
for f in fibo:
print(f,end=' ')
10
>>> import matplotlib.pyplot as plt
>>> x = np.arange(0, 2, 0.01)
>>> y = np.sin(2 * np.pi * x)
>>> plt.plot(x, y)
[<matplotlib.lines.Line2D object at 0x00000244DA2B0D60>]
1.00
0.75
0.50
0.25
0.00
0.25
0.50
0.75
1.00
0.00 0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00
>>> t = \
... 'y qué bien por la mañana \ncorrer en las vagonetas \n\
... llenas de nieve salada \nhacia las blancas casetas'
>>> print(t)
y qué bien por la mañana
correr en las vagonetas
llenas de nieve salada
hacia las blancas casetas
11
>>> n_i = t.count('i')
>>> print(n_i)
3
>>> print(t.upper())
Y QUÉ BIEN POR LA MAÑANA
CORRER EN LAS VAGONETAS
LLENAS DE NIEVE SALADA
HACIA LAS BLANCAS CASETAS
>>> s = "tres eran tres las hijas del rey"
>>> print(s.find('rey'))
29
>>> L = s.split()
>>> type(L)
<class 'list'>
>>> print(L)
['tres', 'eran', 'tres', 'las', 'hijas', 'del', 'rey']
>>> print(L[4])
hijas
>>> type(L[4])
<class 'str'>
>>> s2=s.replace('tres','dos')
>>> print(s2)
dos eran dos las hijas del rey
Observaciones.- La barra invertida ( \) se usa para cortar una línea en el editor y seguir más
abajo, evitando que desborde por la derecha. L es una lista cuyos elementos son strings (las
palabras también son cadenas de caracteres).
9. Funciones
Si un procedimiento se repite muchas veces, lo más adecuado es crear una función. La primera
motivación es, pues, evitar la repetición de código.
[2]: help(cubo)
cubo(x)
el cubo de x
12
[4]: cinco_3 = cubo(5)
print(cinco_3)
125
La palabra clave es def, seguida de un paréntesis que toma los argumentos de entrada (en este
caso es solo uno, x). La función devuelve uno o varios argumentos de salida a través de return;
en este caso, el argumento de salida es y. La indentación es parte de la sintaxis. La cadena de
la primera línea (opcional) es la ayuda sobre la función.
Las funciones se pueden definir de manera implícita, más compacta: se llaman funciones lambda,
o funciones anónimas. La sintaxis es: nombre = lambda parámetros: comando (lambda es una
palabra clave).
10. Clases
Hasta este momento, se ha pasado por alto que Python es un lenguaje orientado a objeto. Eso
quiere decir que cada elemento (sea una variable, un método, una función, etcétera) pertene-
ce a una clase. Los lenguajes orientados a objeto constituyen un paradigma de programación,
donde uno de los conceptos fundamentales es que cada objeto es una ‘encarnación’, una ‘im-
plementación’, un ‘caso’, una ‘ocurrencia’ (en inglés: instance) de la clase, de la cual heredan las
propiedades. Por poner un caso, las ventanas en un sistema operativo podrían ser una clase;
hacer click en determinado icono podría ‘instanciar’ un objeto de la clase ventana, y ese objeto
tiene por ese hecho toda una serie de propiedades (atributos) aparejados –como el color de la
barra–, así como ciertos métodos que se le pueden aplicar (por poner un caso: a una ventana
se le pueden cambiar las dimensiones estirando con el ratón desde los bordes).
La clase define un tipo de objetos con ciertas propiedades, igual que en biología: los Panthera
son un género de la familia de los felinos, o Felidae (por tanto se diría: “han heredado las
propiedades de la clase Felidae”); el tigre (Panthera tigris) es un objeto de la clase Panthera; y mi
tigre Sultán es una instancia de la clase Panthera tigris. Los padres de Sultán instanciaron un
objeto de la clase tigre, y Sultán heredó las propiedades de la clase.
Los objetos pueden contener datos y código. Los datos se llaman campos o atributos, que pue-
den ser comunes a toda la clase (de los tigres) o particulares del objeto (de Sultán). El código
contenido en el objeto son los métodos (los procedimientos) que el objeto puede ejecutar. Es de
señalar que los métodos pueden cambiar los propios atributos del objeto: en ese caso hace falta
una referencia al objeto self.
Por poner un caso, en Python hay una clase que son los números complejos. Los objetos de
esta clase tienen un campo que es la parte real y otro que es la parte imaginaria. Además, estos
objetos tienen
√ definido el método complejo conjugado. (En vez de i, en Python se usa j para
denotar −1).
>>> z = 2 + 3j
>>> type(z)
<class 'complex'>
13
>>> print(z)
(2+3j)
>>> z.imag
3.0
>>> z.real
2.0
>>> z.conjugate()
(2-3j)
Una función, un elemento de un gráfico, un método, una variable, son objetos de una determi-
nada clase. En realidad, en Python todo son objetos.
Aparte de todas las clases propias de Python, se pueden definir las que el usuario desee, espe-
cificando sus campos y sus métodos.
Pato nadando
[5]: __main__.Tigre
[6]: print(x.nombre)
Sultán
[7]: []
[9]: x.trucos
14
[9]: ['dar la pata']
[10]: x.nadar()
Tigre nadando
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_17768/4110289659.py in <module>
----> 1 x.cantar() # Sultán no sabe cantar: los tigres no cantan
Compruébese cómo el método aprender_truco modifica el atributo trucos del propio objeto.
Por otra parte, hay que prestar atención porque el mismo método, con el mismo nombre, puede
ejecutar comandos diferentes dependiendo de la clase del objeto. El método nadar hace algo diferente
en el tigre que en el pato; por ejemplo, raíz podría ser un método que hiciera algo diferente
en un número complejo que en un número real, incluso llamándose de la misma manera. Un
comando que se llame plot podría hacer un gráfico diferente según el tipo de datos que se le
pase como argumento.
Las funciones también son objetos. Una función puede ser argumento de otra función.
def Doble(x):
y = 2 * x
return y
def Seno(x):
y = np.sin(x)
return y
[13]: Seno(np.pi/2)
[13]: 1.0
[14]: Seno(0)
[14]: 0.0
[15]: 3.141592653589793
15
[16]: 3.141592653589793
[17]: 1.0
Las funciones se pueden llamar a sí mismas (propiedad conocida como recursividad). Una fun-
ción que se llama a sí misma es el factorial de x, que se puede definir como el producto de x
por el factorial de x − 1, hasta llegar al 1, cuyo factorial es 1.
num = 3
print("El factorial de", num, "es", factorial(num))
El factorial de 3 es 6
Función open
La función open devuelve un objeto tipo fichero; ese objeto tiene aparejados varios métodos,
uno de los cuales es readline:
fich.close()
1 0.000
2 0.693
3 1.099
4 1.386
16
Obsevaciones.– El objeto fich posee muchos métodos, como write, read o seek. Uno de ellos es
readline, que es el que se usa aquí para leer el contenido línea por línea. Todo fichero abierto
debe cerrarse. Dejarlo abierto puede comprometer su integridad. Si se produce un error y el
programa no llega a la línea fich.close(), hay que cerrarlo ejecutando ese comando en la
consola.
Se pueden leer todos los contenidos y almacenarlos en una variable de texto. Atención, esta
variable contiene caracteres de escape (saltos de línea, etc.), que evidentemente se interpretan
correctamente en la función print.
fichero6.close()
fichero7 = open('ArchivoConPrint.txt','rt')
leer = True
while leer:
línea = fichero7.readline()
if len(línea)==0:
leer = False
else:
print(línea, end='')
fichero7.close()
1 ; 1.0
2 ; 1.4142135623730951
3 ; 1.7320508075688772
4 ; 2.0
5 ; 2.23606797749979
6 ; 2.449489742783178
7 ; 2.6457513110645907
8 ; 2.8284271247461903
9 ; 3.0
17
Funciones del módulo NumPy
El módulo NumPy contiene dos métodos cuya operación es similar a load y save de Matlab:
son np.loadtxt() y np.savetxt(). Deben operar sobre una lista cuyos elementos sean todos
del mismo tipo, pues deben poder almacenarse en un numpy array. Esa lista debe estar escrita
en formato ASCII.
print(datos)
[[1. 0. ]
[2. 0.693]
[3. 1.099]
[4. 1.386]]
[2]: print(type(datos))
<class 'numpy.ndarray'>
1.0
0.0
2.0
0.693
3.0
1.099
4.0
1.386
np.savetxt('raíces.txt',Contenido)
Módulo pickle
En conjunción con la función open, el módulo pickle contiene dos métodos, a saber, load y
dump, que permiten leer y escribir en un fichero de manera muy versátil.
18
>>> fichero1.close()
>>> print(leído)
['manzana', 12, 3.141592653589793]
>>> type(leído)
<class 'list'>
Módulo io
El módulo io (abreviatura de input / output) contiene muchos procedimientos, de los cuales
los básicos son open, write y read. Una de las ventajas es que maneja codificación UTF-8.
>>> import io
Un problema al abrir un fichero con la opción w es que si el fichero existe destruye lo que hay.
Para evitar eso, se puede emplear la opción x, que abre un fichero para escribir a condición de
que el fichero no exista; en caso de que ya exista un fichero con ese nombre, da error:
19
12. Más allá
Entre todos los documentos que pueden servir para profundizar en el aprendizaje de Python,
los siguientes constituyen una sugerencia personal:
1. Bibliografía
– C. H. S WAROOP, “A byte of Python”, disponible en Internet:
python.swaoopch.com
– R. G ONZÁLEZ D UQUE, “Python para todos”, libro gratuito (disponible en Internet).
– S. R. D OTY, “Python basics” (disponible en Internet en diferentes lugares).
– C. H ILL, “Learning scientific programming with Python”, Cambridge University
Press https://scipython.com/about/the-book/
2. Recursos en Internet
– S. T HURLOW, “A Beginner’s Python Tutorial”, disponible tanto en GitHub
github.com/stoive/pythontutorial como en en Wikibooks
– Google’s Ptython class: https://developers.google.com/edu/python.
3. Documentación (en estas páginas Web se pueden encontrar manuales y ayuda para el
aprendizaje)
– Página web oficial de Python https://www.python.org/
– Documentación de la versión: https://docs.python.org/3/
– Documentación de módulos NumPy, matplotlib, etc. (p. ej. en https://numpy.org/
hay abundante documentación y tutorials).
20
21
NumPy
1. Objetos y atributos
El módulo NumPy (numpy.og) ofrece una clase, llamada numpy array, con la cual las varia-
bles se tratan como matrices. Esta clase es similar a una lista pero todos sus elementos deben
ser homogéneos (de modo que no se puede mezclar texto con números, por poner un caso).
Los métodos definidos para esta clase hacen que se pueda programar en Python de manera
muy similar a Matlab (las funciones admiten vectores, la referenciación es similar, etcétera). El
cálculo con numpy arrays es más rápido que con listas de Python. Además, se incluye una ex-
tensa gama de funciones matemáticas (p. ej. generación de números aleatorios, álgebra lineal,
etc.), y una excelente documentación –lo cual, lamentablemente, no es lo habitual en Python:
numpy.org/doc/stable/. En particular, se recomienda la lecturalos capítulos Quickstart y The
absolute basics for beginners
El módulo NumPy se carga así (la abreviatura np es casi un convenio)
[[ 7 8 9]
[10 11 12]]]
>>> # dimensiones de los arrays creados
>>> print(vector.ndim) # dimensión 1
1
>>> print(número.ndim) # nótese: dimensión cero
0
>>> print(matriz.ndim) # dos dimensiones
2
22
>>> print(tensor.ndim) # tres dimensiones
3
Aparte de la referencia a los elementos del numpy array con el mismo método que las listas,
también admiten referencias entre corchetes con varios números: los primeros son el número
del eje (la dimensión), y el último, el número del elemento:
23
>>> A = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
>>> B = A.reshape(4, 3) # filas, columnas
>>> print(B)
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
>>> arr1 = np.array([[1, 2], [3, 4]])
>>> arr2 = np.array([[5, 6], [7, 8]])
>>> arr = np.concatenate((arr1, arr2), axis=1) # ¿qué daría axis=0?
>>> print(arr)
[[1 2 5 6]
[3 4 7 8]]
>>> arr1 = np.array([1, 2, 3])
>>> arr2 = np.array([4, 5, 6])
>>> arr = np.hstack((arr1, arr2))
>>> print(arr)
[1 2 3 4 5 6]
>>> arr = np.vstack((arr1, arr2))
>>> print(arr)
[[1 2 3]
[4 5 6]]
>>> ristra1 = np.arange(0,0.7,0.2)
>>> print(ristra1)
[0. 0.2 0.4 0.6]
>>> ristra2 = np.linspace(0,0.7,5)
>>> print(ristra2)
[0. 0.175 0.35 0.525 0.7 ]
3. Funciones universales
Son métodos que devuelven valores lógicos o índices: all, si todos los elementos cumplen la
condición; any, si alguno la cumple; nonzero, cuáles son los elementos distintos de cero; where,
en qué sitios se cumple la condición. El método np.where es un poco enrevesado: la sintaxis
es np.where(condición, array si cierto, array si falso), donde los arrays pueden ser
un número. En cambio, el método np.argwhere devuelve los índices de los lugares donde se
cumple la condición.
24
>>> NuevoArray = np.where(MiArray>0,MiArray, -1)
>>> # Devuelve MiArray donde cierto, -1 donde falso
>>> print(NuevoArray)
[-1 -1 -1 1 2 3]
>>> sitios = np.argwhere(MiArray>0)
>>> print(sitios)
[[3]
[4]
[5]]
4. Rutinas matemáticas
A partir de aquí, se pueden explorar las funciones que ofrece NumPy, llamadas en rigor Ruti-
nas. Incluyen las trigonométricas (np.sin, np.arctan), redondeo (np.floor, np.ceil), álgebra
(np.sum, np.cumsum, np.diff), exponenciales y logaritmos (np.exp, np.log, np.log10), esta-
dísticas (np.mean, np.quantile), etcétera. En estas tablas, las funciones que toman un array
como argumento se escriben np.función, mientras que los métodos (que se ejecutan añadien-
do .método al nombre del array) se escriben método().
Además, dentro de NumPy hay módulos específicos para el muestreo aleatorio (random), álge-
bra lineal, polinomios, la transformada de Fourier, y más. Se recomienda el capítulo dedicado
a NumPy del libro de C. H ILL, “Learning Scientific Programming with Python” (Cambridge
University Press), y la lista de rutinas de NumPy.
25
matplotlib
[2]: x = np.arange(0,10,0.01)
y = np.sin(x)
plt.plot(x,y)
26
1.00
0.75
0.50
0.25
0.00
0.25
0.50
0.75
1.00
0 2 4 6 8 10
A partir de aquí, se puede modificar la apariencia y los elementos del gráfico. El ; al final de la
línea evita la descripción del objeto de salida (matplotlib.lines. etc.)
[3]: x = np.arange(0,10,0.01)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x,y1, linewidth = 3, label = 'seno');
plt.plot(x, y2, linewidth = 2, linestyle = 'dashed', label='coseno');
plt.yticks(np.linspace(-1,1,5));
plt.ylim(-1.3,1.3);
plt.title('Funciones armónicas');
plt.legend();
27
Funciones armónicas
1.0
0.5
0.0
0.5
1.0 seno
coseno
0 2 4 6 8 10
Los datos se representan con símbolos, a los cuales se les puede cambiar las propiedades fácil-
mente.
4.5
4.0
Anchura del sépalo (cm)
3.5
3.0
2.5
2.0
4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0
Longitud del sépalo (cm)
28
2. Resumen de los comandos más usuales de matplotlib.pyplot
Todos los comandos van precedidos de plt.
plot(x, y) – gráfico de una línea con segmentos que unen los valores x e y.
show() – muestra el gráfico
title(“string”) – título del gráfico
xlabel(“string”) – título del eje x
ylabel(“string”) – título del eje y
figure() – crea una figura y especifica sus atributos
subplot(nrows, ncols, index) – divide una figua en varios gráficos
subplots(nrows, ncols, figsize) – alternativa para crear subplots: devuelve una tu-
pla de una figura y cierto número de ejes.
bar(categorical variables, values, color) – gráfico de barras
barh(categorical variables, values, color) – gráfico de barras horizontal
legend(loc) – crear la leyenda de un gráfico
xticks(index, categorical variables) – lugares de las marcas del eje x (id. para el eje
y).
pie(value, categorical variables) – crea una gráfico de sectores
hist(values, number of bins) – crea un histograma
boxplot(data) – crea un diagrama de cajas
ylim(start value, end value) – especifica los límites del eje y (id. para el eje x).
scatter(x-axis values, y-axis values) – crea un gráfico de dispersión (‘scatter plot’)
axes() – añade unos ejes a la figura
scatter3D(x-axis values, y-axis values, z-axis values) – gráfico de dispersión
tridimensional
plot3D(x-axis values, y-axis values, z-axis values) – gráfico tridimensional
text(x, y, “string”) – escribe un texto en el lugar especificado.
annotate(“string”, ...) – escribe un texto y dibuja una flecha en el lugar especificado.
A continuación se proporciona la lista de los colores predefinidos en matplotlib.
Se puede definir cualquier color que se desee, en diferentes formatos (RGB,
CMYK, HSV, etc.). Por otro lado, ya hay definidas varias paletas de colores.
29
CSS Colors
black bisque forestgreen slategrey
dimgray darkorange limegreen lightsteelblue
dimgrey burlywood darkgreen cornflowerblue
gray antiquewhite green royalblue
grey tan lime ghostwhite
darkgray navajowhite seagreen lavender
darkgrey blanchedalmond mediumseagreen midnightblue
silver papayawhip springgreen navy
lightgray moccasin mintcream darkblue
lightgrey orange mediumspringgreen mediumblue
gainsboro wheat mediumaquamarine blue
whitesmoke oldlace aquamarine slateblue
white floralwhite turquoise darkslateblue
snow darkgoldenrod lightseagreen mediumslateblue
rosybrown goldenrod mediumturquoise mediumpurple
lightcoral cornsilk azure rebeccapurple
indianred gold lightcyan blueviolet
brown lemonchiffon paleturquoise indigo
firebrick khaki darkslategray darkorchid
maroon palegoldenrod darkslategrey darkviolet
darkred darkkhaki teal mediumorchid
red ivory darkcyan thistle
mistyrose beige aqua plum
salmon lightyellow cyan violet
tomato lightgoldenrodyellow darkturquoise purple
darksalmon olive cadetblue darkmagenta
coral yellow powderblue fuchsia
orangered olivedrab lightblue magenta
lightsalmon yellowgreen deepskyblue orchid
sienna darkolivegreen skyblue mediumvioletred
seashell greenyellow lightskyblue deeppink
chocolate chartreuse steelblue hotpink
saddlebrown lawngreen aliceblue lavenderblush
sandybrown honeydew dodgerblue palevioletred
peachpuff darkseagreen lightslategray crimson
peru palegreen lightslategrey pink
linen lightgreen slategray lightpink
3. Documentación y ejemplos
La documentación de matplotlib es excelente y contiene, además de una completa referencia,
diversas guías introductorias que son muy recomendables. En la página Web de matplotlib
matplotlib.org, en el menú Tutorials se ofrecen varios a distintos niveles. Se sugiere además
leer el apartado Plot types de esa misma página. Las “Cheat Sheets” (ver anexo) constituyen
un resumen muy práctico. Otra buena lectura es el capítulo correspondiente a matplotlib en la
obra C. H ILL, “Learning Scientific Programming with Python” (Cambridge University Press).
Por otro lado, en el apartado Examples se proporciona código para crear gráficos de muy dis-
tintos tipos. Basta copiar y pegar. El siguiente código se obtuvo de dicha Galería. Se incluye
aquí también porque está escrito en el estilo Object Oriented. Se inicia creando los ejes con el
procedimiento plt.subplot, y luego se van añadiendo los gráficos como hijos (“children”) de
los ejes (por ejemplo, ax1.plot, ax3.bar, etc).
30
plt.style.use('ggplot')
# bar graphs
x = np.arange(5)
y1, y2 = np.random.randint(1, 25, size=(2, 5))
width = 0.25
ax3.bar(x, y1, width)
ax3.bar(x + width, y2, width,
color=list(plt.rcParams['axes.prop_cycle'])[2]['color'])
ax3.set_xticks(x + width, labels=['a', 'b', 'c', 'd', 'e'])
plt.show()
31
2
0.5
0 0.0
2 0.5
2 0 2 0 2 4 6
20 1
10 0
0 1
a b c d e 2 1 0 1
fig, ax = plt.subplots()
im = ax.imshow(harvest)
# Show all ticks and label them with the respective list entries
ax.set_xticks(np.arange(len(farmers)), labels=farmers)
ax.set_yticks(np.arange(len(vegetables)), labels=vegetables)
32
text = ax.text(j, i, harvest[i, j],
ha="center", va="center", color="w")
Bio nicul n
Co oods re
lee td.
Or Agr g
rp.
Sm lan Joe
Ga ros
ga ifu
nin
G tu
rny L
Co
ith d B
Up mer
Far
Los códigos de esa página pueden ser un buen punto de partida para crear un gráfico de
calidad.
33
Tópicos adicionales
Nótese que lo que devuelve es una tupla, porque hay una coma entre los dos argumentos de
salida: a,b es una tupla (aunque falten los paréntesis).
[2]: li = [1,2,3,4,5]
recibido = minmax_list(li)
print(recibido)
type(recibido)
(1, 5)
[2]: tuple
1
5
[3]: int
Otra manera de desempaquetar las tuplas es con el operador ∗ . Por ejemplo: √ la función
np.hypot(a,b) calcula la hipotenusa de un triángulo de lados a y b, es decir, a + b2 :
2
5.0
34
Ahora bien, como np.hypot necesita dos argumentos . . .
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_10892/3801916387.py in <module>
1 lados = (3,4) # esto es una tupla
----> 2 h = np.hypot(lados)
5.0
3 4
Consideremos otro caso. Esta función halla la solución de un polinomio de segundo grado de
coeficientes a, b, c
[8]: print(raíces.__doc__)
(3.0, 2.0)
3.0 2.0
Otra manera de desempaquetar la tupla:
3.0
2.0
35
También se puede desempaquetar directamente:
3.0
2.0
Si una de las variables no se va a usar, se suele recoger en un objeto al que por convenio se le
da el nombre _:
1920
Empaquetar y desempaquetar tuplas puede usarse con diferentes fines, como definir múltiples
valores de manera compacta
20
o intercambiar valores:
36
2. Formateo del texto
La salida de datos o mensajes en forma texto, sea por pantalla o redirigida hacia un fichero,
se puede modificar adecuadamente para aumentar su legibilidad. El concepto básico es que
ese formateo se lleva a cabo con un método de las cadenas de caracteres llamado format. Ese
método permite la inclusión de variables en la cadena de caracteres, indicada mediante llaves.
Así,
A partir de aquí, se pueden introducir muchas opciones. Se ilustran las más usuales.
Orden
Los números dentro de las llaves indican el orden de la secuencia a sustituir:
Formateo de números
La abreviatura para un entero es :d y para un float es :f
25
3.141593
Detrás de : se pueden especificar diversas opciones.
25
0025
+25
003.14
Alternativamente, se puede emplear esta sintaxis:
[16]: print('{:{ancho}.{prec}f}'.format(np.pi,ancho=6,prec=2))
3.14
37
Datos de una lista
El método .format puede hacer referencia a variables definidas:
[10]: x=22
print('{}'.format(x))
22
O también a elementos de una lista:
14 28
Hay muchas otras posibilidades. Consultar la documentación de format o la página pyfor-
mat.info/
38
3. List comprehension
Python ofrece una sintaxis muy compacta y elegante para crear listas. En muchos otros lengua-
jes de programación, crear una colección implica muchas veces ejecutar un bucle. Por poner
un ejemplo, piénsese cómo se crearía una lista con los cuadrados de los enteros del 1 al 5.
[1]: cuad = []
for num in range(1,6,1):
cuad.append(num**2)
print(cuad)
Este comando actúa de manera que se recorre el iterable, y para cada elemento item que cumpla
la condición se calcula la expresión y se añade ese resultado a la lista. La condición es opcional
y se puede omitir.
Un iterable es un conjunto cuyos elementos se pueden recorrer de uno en uno, como una lista,
una tupla, o una cadena de caracteres. Se puede usar range para crear un iterable.
['plátano', 'manzana']
Las expresiones también pueden tener condiciones:
39
[6]: ParImpar = [[n,'Par'] if n%2 == 0 else [n,'Impar'] for n in range(1,10)]
print(ParImpar)
[[1, 'Impar'], [2, 'Par'], [3, 'Impar'], [4, 'Par'], [5, 'Impar'], [6, 'Par'],
[7, 'Impar'], [8, 'Par'], [9, 'Impar']]
La list comprehension funciona también en colecciones que requieren listas, como un diccionario:
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
He aquí cómo se genera un ’‘mesh”, o mallado (una cuadrícula o rejilla, es decir, todos los
( xi , yi ) a intervalos regulares; en este caso, en una zona del plano)
[9]: import numpy as np
import matplotlib.pyplot as plt
pts = [[x,y] for x in range(11) for y in range(11)]
puntos = np.array(pts)
plt.plot(puntos[:,0],puntos[:,1],'o')
plt.gca().set_aspect('equal', adjustable='box')
plt.draw()
10
0
0 2 4 6 8 10
[10]: print(puntos)
[[ 0 0]
[ 0 1]
[ 0 2]
[ 0 3]
[ 0 4]
[ 0 5]
40
[ 0 6]
[ 0 7]
[ 0 8]
[ 0 9]
[ 0 10]
[ 1 0]
[ 1 1]
...
[10 8]
[10 9]
[10 10]]
Ahora, en cada uno de esos puntos se podría hallar una función z = f ( x, y) para después
dibujarla en tres dimensiones, por ejemplo.
Finalmente, adviértase que se puede utilizar una list comprehension anidada dentro de otra:
41
4. El módulo random
El paquete random está incluido en la instalación básica de Python y proporciona una mane-
ra rápida y sencilla de obtener números aleatorios. Se ilustran aquí algunos de los usos más
habituales.
0.9330093204886947
0.6935571558823811
Obsérvese cómo cada vez que se usa el comando cambia el número al azar elegido. En realidad,
son números pseudoaleatorios (dicho rápidamente, pasan los tests de aleatoriedad, pero se
obtienen mediante un algoritmo). En esta sección se denominan aleatorios o pseudoaleatorios
de manera equivalente.
Para obtener varios números aleatorios, se puede usar una sintaxis como esta:
1
Barajar equivale a obtener una permutación al azar. Téngase en cuenta que este método cambia
la lista original.
[4, 2, 1, 3, 5]
Se puede obtener un elemento al azar de una lista:
Iker
Para escoger una muestra al azar de una colección: método sample
42
[41, 28, 56, 29, 4, 6]
Los números pseudoaleatorios se calculan a partir de una “semilla” (seed). El generador de
números aleatorios va cambiando esta semilla automáticamente de una vez a otra. Pero puede
ser que en alguna ocasión interese obtener exactamente los mismos números ‘aleatorios’, es
decir, que se genere un número al azar pero que siempre sea el mismo. Eso es útil si, por
ejemplo, varias personas diferentes deben comprobar un cálculo, o si se desea obtener siempre
la misma figura, etc. Para eso, se puede especificar la semilla. Ahora bien, luego hay que tener
la precaución de restablecer estado del generador de números aleatorios para que siga como
estaba antes, de manera que siga sacando números diferentes cada vez. Eso se hace así:
0.793340083761663
0.793340083761663
Es un número pseudoaleatorio obtenido a partir de la semilla indicada. Como la semilla es la
misma, el resultado es el mismo.
Una vez completado el procedimiento, hay que dejar el generador de números aleatorios como
estaba antes:
[8]: random.setstate(estado)
numaleat = random.random()
print(numaleat)
numaleat = random.random()
print(numaleat)
0.503344689392641
0.7553120887991164
43
5. Métodos con funciones lambda
Estos métodos se aplican a listas y permiten generar nuevas listas, con la ayuda de una función
(normalmente se emplea una función lambda).
map
La sintaxis es: list(map(función,lista de entrada)). Se llama a la función con todos los
ítems de la lista de entrada, y se devuelve una nueva lista que contiene los elementos que
produce la función con cada uno de los ítems de la lista original.
filter
La sintaxis es list(filter( función, lista de entrada)). Se llama a la función con todos
los ítems de la lista de entrada, y devuelve una nueva lista que contiene los ítems para los
cuales la función se evalúa como True. En este contexto, “filtrar” se toma como sinónimo de
retirar lo inválido.
[6, 12, 4]
44
6. El módulo SymPy
El cálculo simbólico es una posibilidad nada despreciable en los entornos de programación
científicos, como Matlab o Python. Consiste en resolver problemas algebraicamente, no numé-
ricamente; es decir, con símbolos, como x, y, etcétera. Para ello, el ordenador debe contar con
algunas funciones que permitan definir tales símbolos y las reglas algebraicas con las que debe
operar; por ejemplo, x2 + x2 = 2x2 .
En Python, el módulo sympy permite el cálculo simbólico. Se ilustra aquí con algunos ejemplos.
Para comenzar, se importa el módulo y se definen algunos símbolos; x, y, z, t son símbolos
(variables), y las variables i, j, k representan números enteros.
[4]: diff(sin(x)*exp(x),x)
[4]:
e x sin ( x ) + e x cos ( x )
Z
y las integrales: esta integral sen( x ) e x dx se calcula así
[5]: integrate(sin(x)*exp(x),x)
[5]: e x sin ( x ) e x cos ( x )
−
2 2
Se
Z pueden calcular integrales definidas, e incluso integrales impropias: veamos cuánto vale
∞
sen( x ) e x dx (el infinito se representa con dos ceros seguidos, así: 00)
−∞
[7]: limit(sin(x)/x,x,0)
[7]:
1
... y resolver ecuaciones de segundo grado
45
[8]: [2, 3]
Para resolver ecuaciones diferenciales, hay que definir algunos símbolos como funciones; a
d f (t)
continuación resolvamos = − a f (t)
dt
[9]: f = symbols('f',cls=Function)
a = symbols('a')
dsolve(Eq(diff(f(t),t),-a*f(t)),f(t))
[9]:
f (t) = C1 e−at
La derivada de f es un método definido para el objeto f (de clase ’Function’). La derivada
d2 f ( t )
segunda se escribe f(t).diff(t,t). Resolvamos ahora = a (aceleración a constante):
dt2
[10]: dsolve(Eq(f(t).diff(t,t),a),f(t))
[10]: at2
f (t) = C1 + C2 t +
2
(movimiento uniformemente acelerado). Otros ejemplos:
[12]: diff(x**3)
[12]:
3x2
[13]: integrate(x**2,x)
[13]: x3
3
[14]: integrate(log(x),x)
[14]:
x log ( x ) − x
[15]: integrate(sin(x)*cos(x),x)
[15]: sin2 ( x )
2
[16]: expresión = sin(x)
expresión.series(x,0,8)
[16]: x3 x5 x7
+ O x8
x− + −
6 120 5040
Como se ve, esto puede ahorrar bastante tiempo – si uno sabe lo que está haciendo.
El módulo es demasiado extenso como para explorarlo con detalle. Se recomienda a la persona
interesada consultar la documentación.
46
47
Anexo
Bibliografía adicional
Aparte de los libros que se han ido citando a lo largo de este documento, se recomiendan
también los siguientes:
- Scipy Lecture Notes, un repositorio de documentación donde se incluyen valiosas expli-
caciones acerca de NumPy, matplotlib, scipy y otros módulos de interés científico.
- C. R OSSANT, “IPython Interactive Computing and Visualization Cookbook”, Packt
Publishing. El PDF se ofrece gratuitamente en Internet.
Cheat sheets
Por comodidad, a continuación se incluyen algunas hojas de resumen (“cheat sheets”) de do-
minio público (suele indicarse en las mismas su origen; muchas han sido obtenidas de Data-
Camp. Son buenos resúmenes para tener a mano.
48
Lists Also see NumPy Arrays Libraries
Python For Data Science Cheat Sheet >>> a = 'is' Import libraries
Python Basics >>> b = 'nice' >>> import numpy Data analysis Machine learning
Learn More Python for Data Science Interactively at www.datacamp.com >>> my_list = ['my', 'list', a, b] >>> import numpy as np
>>> my_list2 = [[4,5,6,7], [3,4,5,6]] Selective import
>>> from math import pi Scientific computing 2D plotting
Variables and Data Types Selecting List Elements Index starts at 0
Subset Install Python
Variable Assignment
>>> my_list[1] Select item at index 1
>>> x=5 Select 3rd last item
>>> my_list[-3]
>>> x
Slice
5 >>> my_list[1:3] Select items at index 1 and 2
Calculations With Variables >>> my_list[1:] Select items after index 0
>>> my_list[:3] Select items before index 3 Leading open data science platform Free IDE that is included Create and share
>>> x+2 Sum of two variables powered by Python with Anaconda documents with live code,
>>> my_list[:] Copy my_list
7 visualizations, text, ...
>>> x-2 Subtraction of two variables
Subset Lists of Lists
>>> my_list2[1][0] my_list[list][itemOfList]
3
>>> my_list2[1][:2] Numpy Arrays Also see Lists
>>> x*2 Multiplication of two variables
>>> my_list = [1, 2, 3, 4]
10 List Operations
>>> x**2 Exponentiation of a variable >>> my_array = np.array(my_list)
25 >>> my_list + my_list >>> my_2darray = np.array([[1,2,3],[4,5,6]])
>>> x%2 Remainder of a variable ['my', 'list', 'is', 'nice', 'my', 'list', 'is', 'nice']
Selecting Numpy Array Elements Index starts at 0
1 >>> my_list * 2
>>> x/float(2) Division of a variable ['my', 'list', 'is', 'nice', 'my', 'list', 'is', 'nice'] Subset
2.5 >>> my_list2 > 4 >>> my_array[1] Select item at index 1
True 2
Types and Type Conversion Slice
List Methods >>> my_array[0:2] Select items at index 0 and 1
str() '5', '3.45', 'True' Variables to strings array([1, 2])
>>> my_list.index(a) Get the index of an item
int() 5, 3, 1 Variables to integers >>> my_list.count(a) Count an item Subset 2D Numpy arrays
>>> my_list.append('!') Append an item at a time >>> my_2darray[:,0] my_2darray[rows, columns]
float() 5.0, 1.0 Variables to floats >>> my_list.remove('!') Remove an item array([1, 4])
>>> del(my_list[0:1]) Remove an item Numpy Array Operations
bool() True, True, True Variables to booleans >>> my_list.reverse() Reverse the list
>>> my_array > 3
>>> my_list.extend('!') Append an item array([False, False, False, True], dtype=bool)
>>> my_list.pop(-1) Remove an item >>> my_array * 2
Asking For Help >>> my_list.insert(0,'!') Insert an item array([2, 4, 6, 8])
>>> help(str) >>> my_list.sort() Sort the list >>> my_array + np.array([5, 6, 7, 8])
array([6, 8, 10, 12])
Strings
>>> my_string = 'thisStringIsAwesome' Numpy Array Functions
String Operations Index starts at 0
>>> my_string >>> my_array.shape Get the dimensions of the array
'thisStringIsAwesome' >>> my_string[3] >>> np.append(other_array) Append items to an array
>>> my_string[4:9] >>> np.insert(my_array, 1, 5) Insert items in an array
String Operations >>> np.delete(my_array,[1]) Delete items in an array
String Methods >>> np.mean(my_array) Mean of the array
>>> my_string * 2
'thisStringIsAwesomethisStringIsAwesome' >>> my_string.upper() String to uppercase >>> np.median(my_array) Median of the array
>>> my_string + 'Innit' >>> my_string.lower() String to lowercase >>> my_array.corrcoef() Correlation coefficient
'thisStringIsAwesomeInnit' >>> my_string.count('w') Count String elements >>> np.std(my_array) Standard deviation
>>> 'm' in my_string >>> my_string.replace('e', 'i') Replace String elements
True >>> my_string.strip() Strip whitespaces DataCamp
Learn Python for Data Science Interactively
Inspecting Your Array Subsetting, Slicing, Indexing Also see Lists
Python For Data Science Cheat Sheet >>> a.shape Array dimensions
>>> len(a) Length of array
Subsetting
NumPy Basics >>> a[2] 1 2 3 Select the element at the 2nd index
>>> b.ndim Number of array dimensions 3
Learn Python for Data Science Interactively at www.DataCamp.com >>> e.size Number of array elements 1.5 2 3
>>> b[1,2] Select the element at row 0 column 2
>>> b.dtype Data type of array elements 6.0 4 5 6 (equivalent to b[1][2])
>>> b.dtype.name Name of data type
>>> b.astype(int) Convert an array to a different type Slicing
>>> a[0:2] 1 2 3 Select items at index 0 and 1
NumPy 2 array([1, 2])
Asking For Help 1.5 2 3 Select items at rows 0 and 1 in column 1
The NumPy library is the core library for scientific computing in >>> b[0:2,1]
>>> np.info(np.ndarray.dtype) array([ 2., 5.]) 4 5 6
Python. It provides a high-performance multidimensional array
1.5 2 3
object, and tools for working with these arrays. >>> b[:1] Select all items at row 0
Array Mathematics array([[1.5, 2., 3.]]) 4 5 6 (equivalent to b[0:1, :])
Arithmetic Operations >>> c[1,...] Same as [1,:,:]
Use the following import convention: array([[[ 3., 2., 1.],
[ 4., 5., 6.]]])
>>> import numpy as np >>> g = a - b Subtraction
array([[-0.5, 0. , 0. ], >>> a[ : :-1] Reversed array a
NumPy Arrays array([3, 2, 1])
[-3. , -3. , -3. ]])
>>> np.subtract(a,b) Subtraction Boolean Indexing
1D array 2D array 3D array 1 2 3
>>> b + a Addition >>> a[a<2] Select elements from a less than 2
array([1])
axis 1 axis 2 array([[ 2.5, 4. , 6. ],
1 2 3 axis 1 [ 5. , 7. , 9. ]]) Fancy Indexing
1.5 2 3 >>> np.add(b,a) Addition >>> b[[1, 0, 1, 0],[0, 1, 2, 0]] Select elements (1,0),(0,1),(1,2) and (0,0)
axis 0 axis 0
4 5 6 >>> a / b Division array([ 4. , 2. , 6. , 1.5])
array([[ 0.66666667, 1. , 1. ], >>> b[[1, 0, 1, 0]][:,[0,1,2,0]] Select a subset of the matrix’s rows
[ 0.25 , 0.4 , 0.5 ]]) array([[ 4. ,5. , 6. , 4. ], and columns
>>> np.divide(a,b) Division [ 1.5, 2. , 3. , 1.5],
[ 4. , 5. , 6. , 4. ],
Creating Arrays >>> a * b Multiplication [ 1.5, 2. , 3. , 1.5]])
array([[ 1.5, 4. , 9. ],
>>> a = np.array([1,2,3]) [ 4. , 10. , 18. ]])
>>> b = np.array([(1.5,2,3), (4,5,6)], dtype = float) >>> np.multiply(a,b) Multiplication Array Manipulation
>>> c = np.array([[(1.5,2,3), (4,5,6)], [(3,2,1), (4,5,6)]], >>> np.exp(b) Exponentiation
dtype = float) >>> np.sqrt(b) Square root Transposing Array
>>> np.sin(a) Print sines of an array >>> i = np.transpose(b) Permute array dimensions
Initial Placeholders >>> np.cos(b) Element-wise cosine >>> i.T Permute array dimensions
>>> np.log(a) Element-wise natural logarithm
>>> np.zeros((3,4)) Create an array of zeros >>> e.dot(f) Dot product
Changing Array Shape
>>> np.ones((2,3,4),dtype=np.int16) Create an array of ones array([[ 7., 7.], >>> b.ravel() Flatten the array
>>> d = np.arange(10,25,5) Create an array of evenly [ 7., 7.]]) >>> g.reshape(3,-2) Reshape, but don’t change data
spaced values (step value)
>>> np.linspace(0,2,9) Create an array of evenly Comparison Adding/Removing Elements
spaced values (number of samples) >>> h.resize((2,6)) Return a new array with shape (2,6)
>>> e = np.full((2,2),7) Create a constant array >>> a == b Element-wise comparison >>> np.append(h,g) Append items to an array
>>> f = np.eye(2) Create a 2X2 identity matrix array([[False, True, True], >>> np.insert(a, 1, 5) Insert items in an array
>>> np.random.random((2,2)) Create an array with random values [False, False, False]], dtype=bool) >>> np.delete(a,[1]) Delete items from an array
>>> np.empty((3,2)) Create an empty array >>> a < 2 Element-wise comparison Combining Arrays
array([True, False, False], dtype=bool)
>>> np.array_equal(a, b) Array-wise comparison >>> np.concatenate((a,d),axis=0) Concatenate arrays
array([ 1, 2, 3, 10, 15, 20])
I/O >>> np.vstack((a,b)) Stack arrays vertically (row-wise)
Aggregate Functions array([[ 1. , 2. , 3. ],
Saving & Loading On Disk [ 1.5, 2. , 3. ],
>>> a.sum() Array-wise sum [ 4. , 5. , 6. ]])
>>> np.save('my_array', a) >>> a.min() Array-wise minimum value >>> np.r_[e,f] Stack arrays vertically (row-wise)
>>> np.savez('array.npz', a, b) >>> b.max(axis=0) Maximum value of an array row >>> np.hstack((e,f)) Stack arrays horizontally (column-wise)
>>> np.load('my_array.npy') >>> b.cumsum(axis=1) Cumulative sum of the elements array([[ 7., 7., 1., 0.],
>>> a.mean() Mean [ 7., 7., 0., 1.]])
Saving & Loading Text Files >>> b.median() Median >>> np.column_stack((a,d)) Create stacked column-wise arrays
>>> np.loadtxt("myfile.txt") >>> a.corrcoef() Correlation coefficient array([[ 1, 10],
>>> np.std(b) Standard deviation [ 2, 15],
>>> np.genfromtxt("my_file.csv", delimiter=',') [ 3, 20]])
>>> np.savetxt("myarray.txt", a, delimiter=" ") >>> np.c_[a,d] Create stacked column-wise arrays
Copying Arrays Splitting Arrays
Data Types >>> h = a.view() Create a view of the array with the same data >>> np.hsplit(a,3) Split the array horizontally at the 3rd
>>> np.copy(a) Create a copy of the array [array([1]),array([2]),array([3])] index
>>> np.int64 Signed 64-bit integer types >>> np.vsplit(c,2) Split the array vertically at the 2nd index
>>> np.float32 Standard double-precision floating point >>> h = a.copy() Create a deep copy of the array [array([[[ 1.5, 2. , 1. ],
>>> np.complex Complex numbers represented by 128 floats [ 4. , 5. , 6. ]]]),
array([[[ 3., 2., 3.],
>>> np.bool Boolean type storing TRUE and FALSE values [ 4., 5., 6.]]])]
>>> np.object Python object type Sorting Arrays
>>> np.string_ Fixed-length string type >>> a.sort() Sort an array
>>> np.unicode_ Fixed-length unicode type >>> c.sort(axis=0) Sort the elements of an array's axis DataCamp
Learn Python for Data Science Interactively
Python For Data Science Cheat Sheet Asking For Help Dropping
>>> help(pd.Series.loc)
>>> s.drop(['a', 'c']) Drop values from rows (axis=0)
Pandas Basics Selection Also see NumPy Arrays >>> df.drop('Country', axis=1) Drop values from columns(axis=1)
Learn Python for Data Science Interactively at www.DataCamp.com
Getting
>>> s['b'] Get one element Sort & Rank
-5
Pandas >>> df.sort_index() Sort by labels along an axis
>>> df[1:] Get subset of a DataFrame >>> df.sort_values(by='Country') Sort by the values along an axis
The Pandas library is built on NumPy and provides easy-to-use Country Capital Population >>> df.rank() Assign ranks to entries
data structures and data analysis tools for the Python 1 India New Delhi 1303171035
2 Brazil Brasília 207847528
programming language. Retrieving Series/DataFrame Information
Selecting, Boolean Indexing & Setting Basic Information
Use the following import convention: By Position >>> df.shape (rows,columns)
>>> import pandas as pd >>> df.iloc([0],[0]) Select single value by row & >>> df.index Describe index
'Belgium' column >>> df.columns Describe DataFrame columns
Pandas Data Structures >>> df.info() Info on DataFrame
>>> df.iat([0],[0]) >>> df.count() Number of non-NA values
Series 'Belgium'
Summary
A one-dimensional labeled array a 3 By Label
>>> df.loc([0], ['Country']) Select single value by row & >>> df.sum() Sum of values
capable of holding any data type b -5 >>> df.cumsum() Cummulative sum of values
'Belgium' column labels >>> df.min()/df.max() Minimum/maximum values
c 7 Minimum/Maximum index value
Index >>> df.at([0], ['Country']) >>> df.idxmin()/df.idxmax()
d 4 'Belgium' >>> df.describe() Summary statistics
>>> df.mean() Mean of values
By Label/Position >>> df.median() Median of values
>>> s = pd.Series([3, -5, 7, 4], index=['a', 'b', 'c', 'd'])
>>> df.ix[2] Select single row of
DataFrame Country Brazil subset of rows Applying Functions
Capital Brasília
Population 207847528
Columns >>> f = lambda x: x*2
Country Capital Population A two-dimensional labeled >>> df.ix[:,'Capital'] Select a single column of >>> df.apply(f) Apply function
>>> df.applymap(f) Apply function element-wise
data structure with columns 0 Brussels subset of columns
0 Belgium Brussels 11190846 1 New Delhi
of potentially different types 2 Brasília Data Alignment
1 India New Delhi 1303171035
Index >>> df.ix[1,'Capital'] Select rows and columns
2 Brazil Brasília 207847528 Internal Data Alignment
'New Delhi'
NA values are introduced in the indices that don’t overlap:
Boolean Indexing
>>> data = {'Country': ['Belgium', 'India', 'Brazil'], >>> s3 = pd.Series([7, -2, 3], index=['a', 'c', 'd'])
>>> s[~(s > 1)] Series s where value is not >1
'Capital': ['Brussels', 'New Delhi', 'Brasília'], >>> s[(s < -1) | (s > 2)] s where value is <-1 or >2 >>> s + s3
'Population': [11190846, 1303171035, 207847528]} >>> df[df['Population']>1200000000] Use filter to adjust DataFrame a 10.0
b NaN
>>> df = pd.DataFrame(data, Setting
c 5.0
columns=['Country', 'Capital', 'Population']) >>> s['a'] = 6 Set index a of Series s to 6
d 7.0
Created By: Arianne Colton and Sean Chen If ndarray1 is two-dimensions, ndarray1 < 0 If at least one ndarray1.any()
*
creates a two-dimensional boolean array. value is ‘True’
If all values are ndarray1.all()
0.2
0.4
0.6
0.8
1.2
1.4
1.6
1.8
2.2
2.4
2.6
2.8
3.2
3.4
3.6
3.8
4.2
4.4
4.6
4.8
Minor tick 0 1 2 3 4 5
3
Major tick label Grid Lines & markers
Line
(line plot)
X = np.linspace(0.1, 10*np.pi, 1000) Annotation
2 Y = np.sin(X)
Y axis label
ax.plot(X, Y, ”C1o:”, markevery=25, mec=”1.0”) ax.annotate(”A”, (X[250],Y[250]),(X[250],-1),
Y axis label Markers ha=”center”, va=”center”,arrowprops =
(scatter plot) 1 {”arrowstyle” : ”->”, ”color”: ”C1”})
0
1 1 1
0 5 10 15 20 25 30 0
Spines 1 A
Figure Line
Axes (line plot) 0 5 10 15 20 25 30
Scales & projections
0
0 0.25 0.50 0.75 1 1.25 1.50 1.75 2 2.25 2.50 2.75 3 3.25 3.50 3.75 4 Colors
X axis label fig, ax = plt.subplots()
Minor tick label
X axis label ax.set_xscale(”log”)
color can be used, but Matplotlib offers sets of colors:
ax.plot(X, Y, ”C1o-”, markevery=25, mec=”1.0”) 1 AnyC0 C1 C2 C3 C4 C5 C6 C7 C8 C9
1
10 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
Figure, axes & spines 0 2 4 6 8 10 12 14 16
0 0
1 0 2 4 6 8 10 12 14 16
10 1 100 101
fig, axs = plt.subplots(3,3) Size & DPI
axs[0,0].set_facecolor(”#ddddff”)
axs[2,2].set_facecolor(”#ffffdd”) Text & ornaments Consider a square figure to be included in a two-columns A4
paper with 2cm margins on each side and a column separa-
gs = fig.add_gridspec(3, 3) tion of 1cm. The width of a figure is (21 - 2*2 - 1)/2 = 8cm.
ax.fill_betweenx([-1,1],[0],[2*np.pi])
ax = fig.add_subplot(gs[0, :]) One inch being 2.54cm, figure size should be 3.15×3.15 in.
ax.text(0, -1, r” Period $\Phi$”)
ax.set_facecolor(”#ddddff”)
fig = plt.figure(figsize=(3.15,3.15), dpi=50)
1 plt.savefig(”figure.pdf”, dpi=600)
fig, ax = plt.subplots() 0
ax.spines[”top”].set_color(”None”) Period Matplotlib 3.5.0 handout for intermediate users. Copyright (c) 2021 Matplotlib De-
1 velopment Team. Released under a CC-BY 4.0 International License. Supported by
ax.spines[”right”].set_color(”None”) 0 5 10 15 20 25 30 NumFOCUS.
Matplotlib tips & tricks
Transparency Text outline Colorbar adjustment
Scatter plots can be enhanced by using transparency (al- Use text outline to make text more visible. You can adjust a colorbar’s size when adding it.
pha) in order to show area with higher density. Multiple scat-
import matplotlib.patheffects as fx im = ax.imshow(Z)
ter plots can be used to delineate a frontier. text = ax.text(0.5, 0.1, ”Label”)
text.set_path_effects([ cb = plt.colorbar(im,
X = np.random.normal(-1, 1, 500) fx.Stroke(linewidth=3, foreground=’1.0’), fraction=0.046, pad=0.04)
Y = np.random.normal(-1, 1, 500) fx.Normal()]) cb.set_ticks([])
ax.scatter(X, Y, 50, ”0.0”, lw=2) # optional
ax.scatter(X, Y, 50, ”1.0”, lw=0) # optional
ax.scatter(X, Y, 40, ”C1”, lw=0, alpha=0.1)