Use el argumento Axis para manipular una matriz NumPy en Python

Salman Mehmood 20 junio 2023
Use el argumento Axis para manipular una matriz NumPy en Python

Este artículo explica cómo trabajar con argumentos de eje de NumPy y ver qué es un eje en NumPy. También aprenderemos cómo usar un argumento de eje como una operación poderosa para manipular una matriz NumPy en Python rápidamente.

Use un argumento de eje para manipular una matriz NumPy en Python

Para demostrar, necesitamos algunos datos con los que trabajar, pero no queremos nada demasiado grande y complicado; por eso hemos hecho algo que hacemos con mucha frecuencia. Cuando estamos aprendiendo algo sobre NumPy, lo primero que aparece se llama arreglos, por lo que en este caso, ya creamos para probar los arreglos.

import numpy as np

Temperature_Array = np.array(
    [
        [[26, 25, 24], [24, 25, 26]],
        [[27, 25, 23], [25, 28, 24]],
        [[27, 24, 26], [24, 27, 25]],
        [[27, 26, 24], [28, 25, 26]],
    ]
)

Timeseries_Temperature = np.array(
    [[23, 24, 25, 24, 23, 25], [25, 26, 27, 29, 25, 23], [20, 23, 21, 22, 25, 29]]
)

Se supone que la primera matriz de prueba, Temperature_Array, representa un pronóstico cuadriculado. Digamos que tenemos nuestras observaciones cuadriculadas y estamos tratando de emular pasos de cuatro tiempos con seis estaciones dispuestas en dos filas y tres columnas.

El siguiente subarreglo sería el primer paso de tiempo y así sucesivamente.

[[26, 25, 24], [24, 25, 26]]

Notarás que hicimos un número diferente de elementos para cada uno de estos ejes, y hay cuatro pasos de tiempo y tres columnas o tres estaciones en cada fila y dos filas por paso de tiempo.

Un error común al probar algo con NumPy es hacer una matriz de 3x3 o una matriz de 3x3x3, y crees que sabes lo que está pasando, pero cuando lo intentas en el mundo real, no funciona.

Esto se debe a que sus datos reales tienen diferentes números de elementos en estas diferentes direcciones, y no tenía su porción o lo que sea que esté tratando de hacer.

El segundo llamado Timeseries_Temperature, es más sencillo. Representa tres estaciones que observan temperatura cada hora y tienen seis horas.

Nuestras filas son estaciones y las columnas son tiempo.

Si tiene una matriz de cinco dimensiones, entonces tendrá una fila, una columna y la profundidad puede ser el tiempo, pero estas dimensiones son ejes de la matriz. El eje es solo una parte individual de esta matriz NumPy; es una dirección para atravesarlo.

Miremos nuestra Timeseries_Temperature para obtener su dimensión usando el atributo ndim, que es el número de dimensiones de una matriz.

Timeseries_Temperature.ndim

Producción :

2

Digamos que queremos obtener información sobre los valores mínimos. Entonces haremos algo así:

Timeseries_Temperature.min()

Y recuperamos 20 porque 20 es de hecho el valor más bajo en esta matriz, pero probablemente no sea eso lo que queremos. Queremos saber qué estación experimentó la temperatura más baja en cualquier momento en los datos, y tal vez queramos saber la temperatura más baja que experimentó cada estación.

O tal vez queramos saber la temperatura mínima en cada momento y dónde estuvo más frío en un momento dado en esas 6 horas. Aquí es donde el argumento del eje puede entrar y ayudarnos mucho.

No tenemos que hacer bucles, no tenemos que hacer cortes manuales.

Pero, para entenderlo, hagamos un par de cortes aquí.

Timeseries_Temperature[0, :]

Obtendremos el elemento 0 en la dimensión 0 o el eje 0 que nos da la primera fila.

array([23, 24, 25, 24, 23, 25])

Veamos qué sucede si decimos que nos den todo, los dos puntos indican a lo largo del eje cero y nos dan los elementos cero a lo largo del eje uno.

Timeseries_Temperature[:, 0]

Esto nos da la columna 0 y todas las filas.

array([23, 25, 20])

Ahora trabajemos de nuevo con Timeseries_Temperature y llamemos a la función min(). Si pulsamos shift + tab, vemos que tenemos un argumento eje, y por defecto es Ninguno.

Ahora vamos a pasar el eje igual a 0.

Timeseries_Temperature.min(axis=0)

Esto nos da el valor mínimo en la matriz pero el elemento individual.

array([20, 23, 21, 22, 23, 23])

Teníamos las mismas formas en ambos casos, pero en lugar de usar cortes, usamos un argumento de eje, que es la temperatura mínima en forma de columna de cualquier estación en cada hora.

Ahora colapsaremos el eje 1, representado como columnas, y obtendremos una hora mínima de cada uno.

Timeseries_Temperature.min(axis=1)

Producción :

array([23, 23, 20])

Ahora veamos el caso más complicado, por lo que imprimiremos nuestro Temperature_Array nuevamente para mostrarle cómo se ve.

Temperature_Array

Producción :

array([[[26, 25, 24],
        [24, 25, 26]],

       [[27, 25, 23],
        [25, 28, 24]],

       [[27, 24, 26],
        [24, 27, 25]],

       [[27, 26, 24],
        [28, 25, 26]]])

En Temperature_Array, tenemos tres dimensiones fila, columna y profundidad. Si escribimos Temperature_Array[0,:,:], obtenemos el primer bloque, el eje 0 que representa los pasos de tiempo en este caso, y cada corchete es efectivamente un eje.

array([[26, 25, 24],
       [24, 25, 26]])

Esta vez, en lugar de usar el mínimo, tomaremos algunos medios de Temperature_Array usando la función mean().

Temperature_Array.mean()

Producción :

25.458333333333332

Ahora, usaremos un eje igual a 0, lo que significa que colapsaremos el eje 0, que era el conjunto de corchetes más externo de nuestro paso de tiempo.

Temperature_Array.mean(axis=0)

Obtuvimos matrices de dos filas y tres columnas, que es el promedio general de pasos de tiempo de Temperature_Array.

array([[26.75, 25.  , 24.25],
       [25.25, 26.25, 25.25]])

Si sus datos están organizados de manera diferente, es posible que tengamos que usar un eje diferente; en nuestro caso, usamos eje igual a 1.

Temperature_Array.mean(axis=1)

Aquí colapsamos los números de fila, por lo que obtenemos la media en todos los pasos de tiempo de las columnas.

array([[25. , 25. , 25. ],
       [26. , 26.5, 23.5],
       [25.5, 25.5, 25.5],
       [27.5, 25.5, 25. ]])

Ahora pasaremos 2 al argumento eje, y usando eje igual a 2, colapsaremos la dimensión más interna, representada por columnas. Es un promedio por filas en cada paso de tiempo o una matriz de 4x2.

Temperature_Array.mean(axis=2)

Producción :

array([[25.        , 25.        ],
       [25.        , 25.66666667],
       [25.66666667, 25.33333333],
       [25.66666667, 26.33333333]])

Código completo:

# In[1]:

import numpy as np

Temperature_Array = np.array(
    [
        [[26, 25, 24], [24, 25, 26]],
        [[27, 25, 23], [25, 28, 24]],
        [[27, 24, 26], [24, 27, 25]],
        [[27, 26, 24], [28, 25, 26]],
    ]
)

Timeseries_Temperature = np.array(
    [[23, 24, 25, 24, 23, 25], [25, 26, 27, 29, 25, 23], [20, 23, 21, 22, 25, 29]]
)


# In[2]:

Timeseries_Temperature.ndim

# In[3]:

Timeseries_Temperature.min()

# In[4]:

Timeseries_Temperature[0, :]

# In[5]:

Timeseries_Temperature[:, 0]

# In[6]:

Timeseries_Temperature.min(axis=0)

# In[7]:

Timeseries_Temperature.min(axis=1)

# In[8]:

Temperature_Array

# In[9]:

Temperature_Array.ndim

# In[10]:

Temperature_Array[0, :, :]

# In[11]:

Temperature_Array.mean()

# In[12]:

Temperature_Array.mean(axis=0)

# In[13]:

Temperature_Array.mean(axis=1)

# In[14]:

Temperature_Array.mean(axis=2)
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn