Trabajando con recarray

tutoriales

En el artículo de hoy vamos a ver el uso de numpy.recarray (o arrays estructurados) y las posibilidades que tiene usar record arrays, que no son más que arrays numpy a los que se puede acceder usando atributos y donde podemos usar diferente tipo de dato (int, float, string,...) en cada uno de los campos como si fuera una tabla de una hoja de cálculo.

[En esta entrada se ha usado numpy 1.18 sobre python 3.8 pero debería funcionar sin problemas con versiones de numpy como la 1.6 y de Python como la 2.7].

Primero de todo importamos lo necesario:

import numpy as np

Creamos una serie de vectores que serán los que usaremos a posteriori para 'poblar' nuestro recarray.

persona = [
    'juanlu', 'dapid',
    'kiko', 'eugenia',
    'fernando', 'maria',
    'lorena', 'angel',
   'tomas', 'susana'
]
sexo = ['v', 'v', 'v', 'm', 'v', ## 'v' para varon y 'm' para mujer
        'm', 'm', 'v', 'v', 'm']
altura = [185, 170, 175, 168, 183, 159, 152, 191, 179, 178]

Ahora, imaginad que queremos esos tres vectores de datos en un array y queremos conservar el tipo de dato de cada vector (string para persona, string para sexo y entero para la altura en centímetros) y queremos 'titular' cada uno de esos vectores en nuestro nuevo array y queremos acceder a cada uno de esos vectores mediante un atributo. Esto lo podremos hacer de varias maneras creando un recarray:

## Una primera forma
lista = list(zip(persona, sexo, altura))
mirecarray1 = np.array(
    lista,
    dtype = [
        ('persona', str, 10),
        ('sexo', np.str_, 1),
        ('altura', np.int)
    ]
)
mirecarray1 = mirecarray1.view(np.recarray)
## Una segunda forma
mirecarray2 = np.recarray(
    (len(persona),),
    dtype = [
        ('persona', str, 10), 
        ('sexo', np.str_, 1), 
        ('altura', np.int)
    ]
)
mirecarray2.persona = persona
mirecarray2.sexo = sexo
mirecarray2.altura = altura
## Una tercera forma
mirecarray3 = np.core.records.fromarrays(
    [persona, sexo, altura],
    names = 'persona, sexo, altura'
)
## Otras formas
## http://docs.scipy.org/doc/numpy/reference/routines.array-creation.html#creating-record-arrays-numpy-rec

Por último, veamos como podemos hacer operaciones con un recarray. Vamos a extraer la altura media de las mujeres, la altura media de los hombres, y los extremos (máximo y mínimo) de las alturas de las mujeres y de los hombres:

## Altura promedio de las mujeres
print(
    'altura promedio de las mujeres:', 
    mirecarray1.altura[mirecarray1.sexo == 'm'].mean(), 
    'cm'
)
## Altura promedio de los hombres
print(
    'altura promedio de los hombres:', 
    mirecarray1.altura[mirecarray1.sexo == 'v'].mean(), 
    'cm'
)
## Altura maxima y minima de una mujer
print(
    'altura máxima de una mujer:', 
    mirecarray1.altura[mirecarray1.sexo == 'm'].max(), 
    'cm'
)
print(
    'altura mínima de una mujer:', 
    mirecarray1.altura[mirecarray1.sexo == 'm'].min(), 
    'cm'
)
## Altura maxima y minima de un hombre
print(
    'altura máxima de un hombre:', 
    mirecarray1.altura[mirecarray1.sexo == 'v'].max(), 
    'cm'
)
print(
    'altura mínima de un hombre:', 
    mirecarray1.altura[mirecarray1.sexo == 'v'].min(), 
    'cm'
)

La salida del anterior código mostrará:

altura promedio de las mujeres: 164.25 cm
altura promedio de los hombres: 180.5 cm
altura máxima de una mujer: 178 cm
altura mínima de una mujer: 152 cm
altura máxima de un hombre: 191 cm
altura mínima de un hombre: 170 cm

Y esto ha sido todo por hoy pero no desconectéis puesto que tenemos muchas novedades en cola (y poco tiempo).

Saludos.