Introducción al análisis de datos en Python con Numpy

Arrays de 1 dimensión

En la programación cuando trabajamos con colecciones de datos uno de los conceptos más importante es el índice.

El índice en los arrays funciona exactamente igual que en las listas, es simplemente un número que hace referencia a la posición del array que queremos consultar o modificar:

# %%
import numpy as np

arr = np.arange(0, 50, 5)
arr

Índices

La caracterítica más importante de los índices es que se empiezan a contar desde cero, no desde uno, por tanto para acceder al elemento de la primera posición del array utilizaremos el 0:

arr[0]

Si queremos saber el de la quinta posición, simplemente tomamos el 5 y le restamos 1, por tanto sería índice 4:

arr[4]

En Python el índice -1 hace referencia a la última posición de la colección, el -2 al penúltimo, etc.

Así que también podemos utilizar índices negativos en arrays:

arr[-1]

Pero no sirven únicamente para consultar, también sirven para modificar valores:

arr[0] = 99
arr

Slicing

La técnica del slicing nos permite acceder y modificar un rango de valores de un array. Se basa en dos índices, uno de inicio y otro de fin separados por dos puntos. Si dejamos los índices vacíos se toman por defecto el principio y el final:

arr[:]

Para conseguir un subarray de los 3 primeros elementos haríamos [:3] o [0:3]:

arr[:3]

Para modificar un rango del array podemos hacerlo de forma masiva con un valor:

arr[1:-1] = 50
arr

Consideraciones importantes

Los arrays tienen una característica muy especial y es que se encuentran referenciados en la memoria.

¿Qué significa eso? Pues que a la hora de trabajar con subarrays todos los cambios que hagamos se verán reflejados en el array original. Fijaros...

# Reiniciamos el array a como estaba
arr = np.arange(0, 50, 5)

# Extraemos una subarray
sub_arr = arr[0:4]
sub_arr

Por ahora todo bien, pero vamos a modificar este subarray:

sub_arr[:] = 50

sub_arr

Ahora veamos qué ha ocurrido con el array original:

arr

¡Pues que se también se ha actualizado!

Esto ocurre porque numpy hace una gestión óptima de la memoria y no va a malgastarla creando copias por valor.

Para crear una copia real de un array y no modificar el original, tendremos que utilizar el método copy:

arr = np.arange(0, 50, 5)

cop_arr = arr.copy()

cop_arr

Modificamos la copia...

cop_arr[:] = 50

cop_arr

Y el original debería seguir intacto:

arr