8.2 numpy
NumPy es el paquete fundamental para computación científica en Python y manejo de arrays numéricos multi-dimensionales.
La forma más común de importar esta librería es usar el alias np:
En el núcleo de NumPy está el ndarray, donde «nd» es por n-dimensional. Un ndarray es un array multidimensional de elementos del mismo tipo.
Aquí tenemos una diferencia fundamental con las listas en Python que pueden mantener objetos heterogéneos. Y esta característica propicia que el rendimiento de un ndarray sea bastante mejor que el de una lista convencional.
Para crear un array podemos usar:
Si queremos obtener información sobre el array creado, podemos acceder a distintos atributos del mismo:
Datos heterogéneos
Hemos dicho que los ndarray son estructuras de datos que almacenan un único tipo de datos. A pesar de esto, es posible crear un array con los siguientes valores:
Aunque, a priori, puede parecer que estamos mezclando tipos enteros, flotantes y cadenas de texto, lo que realmente se produce (de forma implícita) es una coerción de tipos a Unicode:
Tipos de datos
NumPy maneja gran cantidad de tipos de datos. A diferencia de los tipos de datos numéricos en Python que no establecen un tamaño de bytes de almacenamiento, aquí sí hay una diferencia clara.
Algunos de los tipos de datos numéricos en NumPy se presentan en la siguiente tabla:
Tabla 1: Tipos de datos numéricos en NumPy
Truco: NumPy entiende por defecto que int hace referencia a np.int64 y que float hace referencia a np.float64. Son «alias» bastante utilizados.
Si creamos un array de números enteros, el tipo de datos por defecto será int64:
Sin embargo podemos especificar el tipo de datos que nos interese:
Lo mismo ocurre con valores flotantes, donde float64 es el tipo de datos por defecto. Es posible convertir el tipo de datos que almacena un array mediante el método astype. Por ejemplo:
ndarray vs list
Como ya se ha comentado en la introducción de esta sección, el uso de ndarray frente a list está justificado por cuestiones de rendimiento. Pero veamos un ejemplo clarificador en el que sumamos 10 millones de valores enteros:
En cualquier caso, existe la posibilidad de convertir a lista cualquier ndarray mediante el método tolist():
Matrices
Una matriz no es más que un array bidimensional. Como ya se ha comentado, NumPy provee ndarray que se comporta como un array multidimensional con lo que podríamos crear una matriz sin mayor problema.
Veamos un ejemplo en el que tratamos de construir la siguiente matriz:
Nos apoyamos en una lista de listas para la creación de la matriz:
Ejercicio
Cree los siguientes arrays en NumPy:
Obtenga igualmente las siguientes características de cada uno de ellos: dimensión, tamaño, forma y tipo de sus elementos.
Cambiando la forma
Dado un array, podemos cambiar su forma mediante la función np.reshape():
Si sólo queremos especificar un número determinado de filas o columnas, podemos dejar la otra dimensión a -1:
Advertencia: En el caso de que no exista posibilidad de cambiar la forma del array por el número de filas y/o columnas especificado, obtendremos un error de tipo ValueError: cannot reshape array.
Almacenando arrays
Es posible que nos interese almacenar (de forma persistente) los arrays que hemos ido creando. Para ello NumPy nos provee, al menos, de dos mecanismos:
Almacenamiento en formato binario propio: Mediante el método save() podemos guardar la estructura de datos en ficheros .npy. Veamos un ejemplo:
Almacenamiento en formato de texto plano: NumPy proporciona el método savetxt() con el que podremos volcar la estructura de datos a un fichero de texto csv. Veamos un ejemplo:
Truco: Por defecto el almacenamiento y la carga de arrays en formato texto usa tipos de datos flotantes. Es por ello que hemos usado el parámetro fmt en el almacenamiento y el parámetro dtype en la carga.
Es posible cargar un array desempaquetando sus valores a través del parámetro unpack. En el siguiente ejemplo separamos las columnas en tres variables diferentes: