Saltar al contenido

python: ¿cómo funciona numpy.newaxis y cuándo usarlo?

octubre 23, 2021
apple touch icon@2

Simplemente pon, numpy.newaxis se usa para aumentar la dimensión de la matriz existente por una dimensión más, cuando se utiliza una vez. Por lo tanto,

  • 1D la matriz se convertirá en 2D formación

  • 2D la matriz se convertirá en 3D formación

  • 3D la matriz se convertirá en 4D formación

  • 4D la matriz se convertirá en 5D formación

etcétera..

Aquí hay una ilustración visual que muestra promoción de matriz 1D a matrices 2D.

visualización de newaxis canva


Escenario 1: np.newaxis puede ser útil cuando quieras explícitamente convertir una matriz 1D en una vector fila o un vector de columna, como se muestra en la imagen de arriba.

Ejemplo:

# 1D array
In [7]: arr = np.arange(4)
In [8]: arr.shape
Out[8]: (4,)

# make it as row vector by inserting an axis along first dimension
In [9]: row_vec = arr[np.newaxis, :]     # arr[None, :]
In [10]: row_vec.shape
Out[10]: (1, 4)

# make it as column vector by inserting an axis along second dimension
In [11]: col_vec = arr[:, np.newaxis]     # arr[:, None]
In [12]: col_vec.shape
Out[12]: (4, 1)

Escenario-2: Cuando queremos hacer uso de radiodifusión numpy como parte de alguna operación, por ejemplo, mientras se hace adición de algunas matrices.

Ejemplo:

Digamos que desea agregar las siguientes dos matrices:

 x1 = np.array([1, 2, 3, 4, 5])
 x2 = np.array([5, 4, 3])

Si intenta agregarlos así, NumPy generará lo siguiente ValueError :

ValueError: operands could not be broadcast together with shapes (5,) (3,)

En esta situación, puede utilizar np.newaxis para aumentar la dimensión de una de las matrices para que NumPy pueda transmisión.

In [2]: x1_new = x1[:, np.newaxis]    # x1[:, None]
# now, the shape of x1_new is (5, 1)
# array([[1],
#        [2],
#        [3],
#        [4],
#        [5]])

Ahora, agregue:

In [3]: x1_new + x2
Out[3]:
array([[ 6,  5,  4],
       [ 7,  6,  5],
       [ 8,  7,  6],
       [ 9,  8,  7],
       [10,  9,  8]])

Alternativamente, también puede agregar un nuevo eje a la matriz x2:

In [6]: x2_new = x2[:, np.newaxis]    # x2[:, None]
In [7]: x2_new     # shape is (3, 1)
Out[7]: 
array([[5],
       [4],
       [3]])

Ahora, agregue:

In [8]: x1 + x2_new
Out[8]: 
array([[ 6,  7,  8,  9, 10],
       [ 5,  6,  7,  8,  9],
       [ 4,  5,  6,  7,  8]])

Nota: Observe que obtenemos el mismo resultado en ambos casos (pero uno es la transposición del otro).


Escenario-3: Esto es similar al escenario-1. Pero puedes usar np.newaxis más de una vez para promover la matriz a dimensiones superiores. A veces, esta operación es necesaria para matrices de orden superior (es decir, tensores).

Ejemplo:

In [124]: arr = np.arange(5*5).reshape(5,5)

In [125]: arr.shape
Out[125]: (5, 5)

# promoting 2D array to a 5D array
In [126]: arr_5D = arr[np.newaxis, ..., np.newaxis, np.newaxis]    # arr[None, ..., None, None]

In [127]: arr_5D.shape
Out[127]: (1, 5, 5, 1, 1)

Como alternativa, puede utilizar numpy.expand_dims que tiene un intuitivo axis kwarg.

# adding new axes at 1st, 4th, and last dimension of the resulting array
In [131]: newaxes = (0, 3, -1)
In [132]: arr_5D = np.expand_dims(arr, axis=newaxes)
In [133]: arr_5D.shape
Out[133]: (1, 5, 5, 1, 1)

Más antecedentes sobre np.newaxis vs np.reshape

newaxis también se denomina como un pseudoíndice que permite la adición temporal de un eje a una matriz múltiple.

np.newaxis utiliza el operador de corte para recrear la matriz mientras numpy.reshape cambia la forma de la matriz al diseño deseado (asumiendo que las dimensiones coinciden; Y esto es debe para reshape que suceda).

Ejemplo

In [13]: A = np.ones((3,4,5,6))
In [14]: B = np.ones((4,6))
In [15]: (A + B[:, np.newaxis, :]).shape     # B[:, None, :]
Out[15]: (3, 4, 5, 6)

En el ejemplo anterior, insertamos un eje temporal entre el primer y segundo eje de B (utilizar la radiodifusión). Un eje faltante se completa aquí usando np.newaxis para hacer el radiodifusión trabajo de operación.


Consejo general: También puedes usar None en lugar de np.newaxis; Estos son de hecho los mismos objetos.

In [13]: np.newaxis is None
Out[13]: True

PD También vea esta gran respuesta: newaxis vs reshape para agregar dimensiones

close