====== NumPy ======
Se suele cargar en Python con el alias ''np'':
import numpy as np
===== Arrays =====
Podemos convertir una lista de Python en un array/matriz de NumPy:
mylist = [1, 2, 3]
myarray = np.array(mylist)
type(myarray)
# Devolverá: numpy.ndarray
==== Métodos ====
=== arange ===
Genera un array:
np.arange(0, 3)
# array([0, 1, 2, 3])
# Genera un array del 0 al 10, pero con saltos de 2
np.arange(0, 10, 2)
# array([0, 2, 4, 6, 8])
=== zeros ===
Genera arrays de ceros. Permite indicar las dimensiones del array:
np.zeros(shape=(3,5))
# resultado:
#array([[0., 0., 0., 0., 0.],
# [0., 0., 0., 0., 0.],
# [0., 0., 0., 0., 0.]])
No es necesario indicar el argumento ''shape'', podemos ahorrárnoslo y hacer ''np.zeros%%((3,5))%%''
Por defecto, el método **zeros()** crea números decimales (//float//).
=== ones ===
Genera arrays de unos. Permite indicar las dimensiones del array:
np.ones(shape=(3,5))
# resultado:
#array([[1., 1., 1., 1., 1.],
# [1., 1., 1., 1., 1.],
# [1., 1., 1., 1., 1.]])
Por defecto, el método **ones()** crea números decimales (//float//).
=== max ===
Devuelve el valor más alto de un array:
# arr = array([ 4, 63, 40, 60, 92, 64, 5, 12, 93, 40])
arr.max() # 93
=== min ===
Devuelve el valor más pequeño de un array:
# arr = array([ 4, 63, 40, 60, 92, 64, 5, 12, 93, 40])
arr.min() # 4
=== argmax ===
Devuelve la posición del elemento más grande del array
# arr = array([ 4, 63, 40, 60, 92, 64, 5, 12, 93, 40])
arr.argmax # 8
=== argmin ===
Devuelve la posición del elemento más grande del array
# arr = array([ 4, 63, 40, 60, 92, 64, 5, 12, 93, 40])
arr.argmin # 0
=== mean ===
Calcula el valor medio de un array
# arr = array([ 4, 63, 40, 60, 92, 64, 5, 12, 93, 40])
arr.mean() # 47.3
=== reshape ===
Cambiar las dimensiones de un array
arr = np.random.randint(0, 100, 10)
# array([95, 11, 81, 70, 63, 87, 75, 9, 77, 40])
arr.reshape((5, 2))
# array([[95, 11],
# [81, 70],
# [63, 87],
# [75, 9],
# [77, 40]])
Las nuevas dimensiones tiene que ser lógicas. Si tenemos un array con 10 elementos, no podemos convertirlo en un array de 3 filas y 2 columnas, por ejemplo.
Podemos combinar métodos:
# Crear una matriz de 10 filas y 10 columnas con los 100 primeros números (del 0 al 99)
mat = np.arange(0, 100).reshape(10,10)
=== copy ===
Realiza una copia de un array
mat = np.arange(0, 100).reshape(10, 10)
matnew = mat.copy()
==== Selección ====
Para coger algún elemento del array, nos referimos a su posición.
mat = np.arange(0, 100).reshape(10, 10)
# Elemento que ocupa la posición 0, 10 (fila, columna):
mat[0,10]
Para coger todos los elementos de una fila o columna utilizamos el //slicing// típico de Python:
# Todos los valores de las filas, pero de la columna que ocupa la posición 1
mat[:,1]
# Todos los valores de las columnas para la fila 2:
mat[2, :]
# Porción:
mat[0:3,0,3]
===== Números aleatorios =====
# Semilla para la aleatoriedad
np.random.seed(101)
# Creamos un array de 10 números entre el 0 y el 100
arr = np.random.randint(0, 100, 10)
===== Imágenes =====
Por sí mismo, NumPy no es capaz de manejar imágenes sino que se apoya en el módulo PIL (biblioteca pillow, //Python Imaging Library//)
import numpy as np
from PIL import Image
# Para poder ver las imágenes en un Notebook de Jupyter
import matplotlib.pyplot as plt
%matplotlib inline
pic = Image.open('ruta/imagen.png')
# Si queremos ver la imagen en Jupyter
pic
type(pic)
# PIL.PngImagePlugin.PngImageFile
Convertimos la imagen a un array de NumPy:
pic_arr = np.asarray(pic)
type(pic_array)
# numpy.ndarray
pic_arr.shape
# (1080,1920, 3)
# Mostrar el array como imagen:
plt.imshow(pic_arr)
Para acceder a los canales de color:
pic_red = pic_arr.copy()
# R = 0, G = 1, B = 2
# Canal rojo. 0, sin rojo, negro. 255 puro rojo.
pic_red[:,:,0]
# Lo representamos como escala de grises, es decir,
# si la imagen se acerca al negro, es que no tendrá presencia de rojo.
# Si se acerca al blanco, tendrá mucha presencia de rojo.
plt.imshow(pic_red[:,:,0],cmap='gray')
# Lo mismo para el verde
plt.imshow(pic_red[:,:,1],cmap='gray')
# Lo mismo para el azul
plt.imshow(pic_red[:,:,2],cmap='gray')