8.2 numpy

8.2 numpy

NumPy es el paquete fundamental para computación científica en Python y manejo de arrays numéricos multi-dimensionales.

8.2 numpy

La forma más común de importar esta librería es usar el alias np:

8.2 numpy

8.2.1 ndarray

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:

8.2 numpy

Si queremos obtener información sobre el array creado, podemos acceder a distintos atributos del mismo:

8.2 numpy

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:

8.2 numpy

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:

8.2 numpy

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

8.2 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:

8.2 numpy

Sin embargo podemos especificar el tipo de datos que nos interese:

8.2 numpy

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:

8.2 numpy

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:

8.2 numpy

Nota: El cómputo es casi 12 veces más rápido utilizando ndarray frente a listas clásicas.

En cualquier caso, existe la posibilidad de convertir a lista cualquier ndarray mediante el método tolist():

8.2 numpy

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:

8.2 numpy

Nos apoyamos en una lista de listas para la creación de la matriz:

8.2 numpy

Ejercicio

Cree los siguientes arrays en NumPy:

8.2 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():

8.2 numpy

Si sólo queremos especificar un número determinado de filas o columnas, podemos dejar la otra dimensión a -1:

8.2 numpy

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:

8.2 numpy

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:

8.2 numpy

8.2 numpy

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:

8.2 numpy

Publicaciones Similares