NumPy práctico (I): Creando ndarrays

NumPy (un acrónimo de Numeric Python) es una biblioteca para trabajar con arrays y matrices multi-dimensionales. Fue creado en 2005 por Travis Oliphant, y desde entonces ha recibido numerosas contribuciones de la comunidad que le permitieron crecer hasta convertirse en una de las herramientas más usadas en ciencia de datos.

NumPy te permite manipular arrays enormes de una forma muy eficiente. Esto es gracias a una capa de bajo nivel bien implementada (escrita principalmente en C) que hace la mayor parte del trabajo pesado. Una capa de Python encima te permite usar sus poderosas capacidades computacionales con una sintaxis amigable.

Esta serie de artículos está centrada en NumPy, y tiene una vibra mucho más tutorial. Programemos juntos y escribe los ejemplos, creo que esa es por mucho la forma más fácil de aprender.

ndarrays

ndarray es la estructura de datos central en NumPy. Piensa en él como un array con mucha funcionalidad extra y mucho mejor rendimiento. Soporta una gran variedad de operaciones vectorizadas que te permitirán realizar cálculos con una sintaxis concisa y buen rendimiento.

En este artículo, aprenderemos sobre algunas de las formas más comunes de crear ndarrays. Bien, ¡empecemos!

Oh, pero antes de empezar, primero importemos NumPy. El alias estándar para NumPy es np, y usualmente se importa así:

import numpy as np

Puedes crear ndarrays a partir de objetos tipo secuencia, como listas o tuplas. En el siguiente ejemplo creamos una lista estándar de Python y luego la convertimos en un ndarray usando el método np.array:

primes = [2, 3, 5, 7, 11, 13, 17]
arr = np.array(primes)
arr
array([ 2,  3,  5,  7, 11, 13, 17])

Hay dos datos interesantes sobre un ndarray:

  • Shape (forma): Es la forma del array, así de simple. Por ejemplo, un ndarray con shape 3,5 es una matriz con 3 filas y 5 columnas.
  • dtype: El tipo de datos de las entradas en el array. Estos valores se infieren dinámicamente en tiempo de creación pero pueden ser especificados durante la creación o convertidos después de que el array fue creado.
arr.shape
(7,)
arr.dtype
dtype('int64')

Puedes ver que nuestro array tiene shape 7, (7 entradas, unidimensional) e int64 como tipo de datos. Veamos qué pasa cuando creamos un array a partir de una lista de Python que contiene números con valores decimales.

numbers = [1.7, 4.8, 5.5, 52.7, 11.3, 14.63]
arr = np.array(numbers)
arr
array([ 1.7 ,  4.8 ,  5.5 , 52.7 , 11.3 , 14.63])
arr.shape
(6,)
arr.dtype
dtype('float64')

Ahora el dtype del array es float64. NumPy hace un gran trabajo infiriendo el tipo de datos que nuestro array va a tener, pero puedes especificarlo en la creación usando el argumento dtype. Podemos pedirle a NumPy, por ejemplo, que trate los valores como enteros, descartando la parte decimal:

numbers = [1.7, 4.8, 5.5, 52.7, 11.3, 14.63]
arr = np.array(numbers, dtype=np.int64) # NumPy también soporta, entre muchos otros, int32
arr
array([ 1,  4,  5, 52, 11, 14])

Por supuesto, puedes usar conversión de tipos después de que un array ha sido creado. Para esto, usa el método astype.

floatarr = np.array([1.1, 2.3, 3.5, 4,7])
intarr = floatarr.astype(np.int64)
intarr
array([1, 2, 3, 4, 7])

Otro detalle importante que recordar es que listas con otras listas anidadas dentro llevarán a la creación de arrays multi-dimensionales. Por ejemplo, una lista como la siguiente produce un ndarray de 3x3

matrixlist = [[1,2,3],[4,5,6,],[7,8,9]]
arr = np.array(matrixlist)
arr
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
arr.shape
(3, 3)

Ok, eso es suficiente por ahora con creación a partir de objetos tipo secuencia. Veamos algunas otras utilidades incorporadas de creación de arrays

Creando arrays llenos de ceros

np.zeros es una función que recibe como entrada una tupla de forma y crea un array con esa forma y cada entrada establecida en 0.

# Esto crea un array unidimensional de ceros con 8 entradas
zarr = np.zeros(8)
zarr
array([0., 0., 0., 0., 0., 0., 0., 0.])
# Esto crea una matriz 5x5 llena de ceros
zarr = np.zeros((5,5))
zarr
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])

Creando rangos de valores

np.arange es una función muy útil que crea un array con todos los valores en un rango.

# Esto crea un array con entradas de 0 a 14
rarr = np.arange(15)
rarr
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])

Este es un muy buen lugar para introducir el método reshape. Toma un ndarray y crea uno nuevo con las dimensiones proporcionadas. Esto se puede combinar con arange para producir una matriz 8x8 con números de 0 a 63

rarr = np.arange(64).reshape(8,8)
rarr
array([[ 0,  1,  2,  3,  4,  5,  6,  7],
       [ 8,  9, 10, 11, 12, 13, 14, 15],
       [16, 17, 18, 19, 20, 21, 22, 23],
       [24, 25, 26, 27, 28, 29, 30, 31],
       [32, 33, 34, 35, 36, 37, 38, 39],
       [40, 41, 42, 43, 44, 45, 46, 47],
       [48, 49, 50, 51, 52, 53, 54, 55],
       [56, 57, 58, 59, 60, 61, 62, 63]])
rarr.shape
(8, 8)

Creando arrays con valores aleatorios

np.random.randn es una función extremadamente útil. Crea un array lleno con datos aleatorios (con distribución normal estándar) y, como np.zeros, recibe una tupla de forma como argumento principal.

randomarr = np.random.randn(5)
randomarr
array([-1.5745314 , -1.00901794, -1.15070662,  1.69227946,  0.30028233])
randomarr = np.random.randn(3,3)
randomarr
array([[-0.96191126,  1.4272083 ,  0.38075726],
       [-0.09240098,  0.80662898, -1.04838281],
       [-0.58463188,  1.02508633, -0.0234994 ]])

Esto cubre la mayoría de escenarios básicos

No parece mucho, pero ya hemos cubierto lo suficiente para lidiar con los escenarios más comunes de creación de arrays por nuestra cuenta. Hay otras técnicas que probablemente serían útiles en situaciones específicas, pero ahora estás más que listo para comenzar tu viaje con NumPy!

En el siguiente artículo comenzaremos a manipular datos aprendiendo cómo realizar operaciones aritméticas con ndarrays.

¡Gracias por leer!

Qué hacer después

Juan Luis Orozco Villalobos

¡Hola! Soy Juan, ingeniero de software y consultor en Budapest. Me especializo en computación en la nube e IA, y me encanta ayudar a otros a aprender sobre tecnología e ingeniería