¿Cómo uso np.newaxis?

9 minutos de lectura

avatar de usuario
Yue Harriet Huang

Que es numpy.newaxis y cuando debo usarlo?

Usándolo en una matriz 1-D x produce:

>>> x
array([0, 1, 2, 3])

>>> x[np.newaxis, :]
array([[0, 1, 2, 3]])

>>> x[:, np.newaxis]
array([[0],
       [1],
       [2],
       [3]])

  • except that it changes a row vector to a column vector? El primer ejemplo no es un vector fila. Ese es un concepto de matlab. En python es solo un vector unidimensional sin concepto de fila o columna. Los vectores de fila o columna son bidimensionales, como el segundo ejemplo.

    – endolito

    10/08/2018 a las 16:30


  • Ese término no proviene de matlab, es un concepto matemático y una forma perfectamente válida de describir las matrices en su ejemplo. math.stackexchange.com/questions/1198729/…

    – rocasNondas

    13 de agosto de 2021 a las 13:55

avatar de usuario
kmario23

Simplemente pon, numpy.newaxis se usa para aumentar la dimensión de la matriz existente por una dimensión máscuando se utilizan una vez. De este modo,

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

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

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

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

y así..

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

visualización de canva newaxis


Escenario 1: np.newaxis puede ser útil cuando quieras explícitamente convertir una matriz 1D en una vector fila o un columna de vectorescomo 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 transmisión entumecida como parte de alguna operación, por ejemplo, al hacer suma 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, agrega:

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, agrega:

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 a promover la matriz a dimensiones más altas. Tal operación a veces 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.nuevoeje contra np.reformar

newaxis también se denomina pseudoíndice que permite la adición temporal de un eje en 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 (suponiendo que las dimensiones coincidan; y esto es deber para reshape a suceder).

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 el segundo eje de B (usar la radiodifusión). Un eje faltante se rellena aquí usando np.newaxis para hacer el radiodifusión trabajo de operación.


Sugerencia 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 remodelar para agregar dimensiones

  • ¿Qué tipo de operación es x1_new + x2? Me resulta extraño porque pensé que solo se pueden sumar dos matrices si tienen las mismas dimensiones (o si una de ellas es en realidad solo un escalar).

    – Esteban

    1 de junio de 2017 a las 22:16

  • @Stephen Como también señalé en la respuesta, se debe a NumPy Broadcasting.

    – kmario23

    2 de junio de 2017 a las 10:32

  • O @ kmario23 == Ian Dzindo, o Ian Dzindo01 plagiaron esta respuesta en esta publicación de Medium de 2018: medium.com/@ian.dzindo01/….

    – Chiraz Ben Abdelkader

    1 de julio de 2020 a las 9:13

  • @ kmario23 De hecho, la atribución está oculta en la última oración del artículo, no es de extrañar que no la haya visto. Lo considero plagio límite incluso con esta atribución. En mi libro, la copia palabra por palabra solo es aceptable si es el mismo autor publicando en diferentes plataformas. Esperaba algo mejor de Medium.

    – Chiraz Ben Abdelkader

    1 de julio de 2020 a las 9:46


  • “Espera, es todo None? -Siempre ha sido.”

    – Darkonauta

    24 oct 2020 a las 13:05

avatar de usuario
MSeifert

Que es np.newaxis?

los np.newaxis es solo un alias para la constante de Python Nonelo que significa que dondequiera que uses np.newaxis también podrías usar None:

>>> np.newaxis is None
True

es solo más descriptivo si lees código que usa np.newaxis en vez de None.

Cómo utilizar np.newaxis?

los np.newaxis se utiliza generalmente con rebanar. Indica que desea agregar una dimensión adicional a la matriz. La posición del np.newaxis representa donde quiero agregar dimensiones.

>>> import numpy as np
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a.shape
(10,)

En el primer ejemplo, uso todos los elementos de la primera dimensión y agrego una segunda dimensión:

>>> a[:, np.newaxis]
array([[0],
       [1],
       [2],
       [3],
       [4],
       [5],
       [6],
       [7],
       [8],
       [9]])
>>> a[:, np.newaxis].shape
(10, 1)

El segundo ejemplo agrega una dimensión como primera dimensión y luego usa todos los elementos de la primera dimensión de la matriz original como elementos en la segunda dimensión de la matriz de resultados:

>>> a[np.newaxis, :]  # The output has 2 [] pairs!
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
>>> a[np.newaxis, :].shape
(1, 10)

Del mismo modo, puede utilizar varios np.newaxis para agregar múltiples dimensiones:

>>> a[np.newaxis, :, np.newaxis]  # note the 3 [] pairs in the output
array([[[0],
        [1],
        [2],
        [3],
        [4],
        [5],
        [6],
        [7],
        [8],
        [9]]])
>>> a[np.newaxis, :, np.newaxis].shape
(1, 10, 1)

¿Hay alternativas a np.newaxis?

Hay otra funcionalidad muy similar en NumPy: np.expand_dimsque también se puede utilizar para insertar una dimensión:

>>> np.expand_dims(a, 1)  # like a[:, np.newaxis]
>>> np.expand_dims(a, 0)  # like a[np.newaxis, :]

Pero dado que solo inserta 1está en el shape también podrías reshape la matriz para agregar estas dimensiones:

>>> a.reshape(a.shape + (1,))  # like a[:, np.newaxis]
>>> a.reshape((1,) + a.shape)  # like a[np.newaxis, :]

La mayoría de las veces np.newaxis es la forma más fácil de agregar dimensiones, pero es bueno conocer las alternativas.

Cuándo usar np.newaxis?

En varios contextos es útil agregar dimensiones:

  • Si los datos deben tener un número específico de dimensiones. Por ejemplo, si desea utilizar matplotlib.pyplot.imshow para mostrar una matriz 1D.

  • Si desea que NumPy transmita matrices. Al agregar una dimensión, podría, por ejemplo, obtener la diferencia entre todos los elementos de una matriz: a - a[:, np.newaxis]. Esto funciona porque las operaciones NumPy se transmiten a partir de la última dimensión. 1.

  • Para agregar una dimensión necesaria para que NumPy pueden matrices de difusión. Esto funciona porque cada dimensión de longitud 1 simplemente se transmite a la longitud de la correspondiente1 dimensión de la otra matriz.


1 Si desea leer más sobre las reglas de transmisión, el NumPy documentación sobre ese tema es muy bueno. También incluye un ejemplo con np.newaxis:

>>> a = np.array([0.0, 10.0, 20.0, 30.0])
>>> b = np.array([1.0, 2.0, 3.0])
>>> a[:, np.newaxis] + b
array([[  1.,   2.,   3.],
       [ 11.,  12.,  13.],
       [ 21.,  22.,  23.],
       [ 31.,  32.,  33.]])

  • No veo la diferencia entre los casos de uso 2 y 3; ambos tratan de permitir que NumPy transmita una matriz como parte de alguna operación. De lo contrario, sería útil agregar un ejemplo para el tercer caso de uso para aclarar el punto.

    – Chiraz Ben Abdelkader

    1 de julio de 2020 a las 11:05

  • @ChirazBenAbdelkader Sí, la distinción no es tan clara. No estoy seguro de si debo eliminar el tercer punto o fusionarlo con el segundo.

    – MSeifert

    1 de julio de 2020 a las 19:02

avatar de usuario
Kevin

Comenzaste con una lista unidimensional de números. Una vez que usaste numpy.newaxisla convirtió en una matriz bidimensional, que consta de cuatro filas de una columna cada una.

Luego podría usar esa matriz para la multiplicación de matrices, o involucrarla en la construcción de una matriz más grande de 4 xn.

newaxis objeto en la tupla de selección sirve para ampliar las dimensiones de la selección resultante por una unidad de longitud dimensión.

No es solo la conversión de matriz de fila a matriz de columna.

Considere el siguiente ejemplo:

In [1]:x1 = np.arange(1,10).reshape(3,3)
       print(x1)
Out[1]: array([[1, 2, 3],
               [4, 5, 6],
               [7, 8, 9]])

Ahora agreguemos una nueva dimensión a nuestros datos,

In [2]:x1_new = x1[:,np.newaxis]
       print(x1_new)
Out[2]:array([[[1, 2, 3]],

              [[4, 5, 6]],

              [[7, 8, 9]]])

Puedes ver eso newaxis agregó la dimensión adicional aquí, x1 tenía dimensión (3,3) y X1_new tiene dimensión (3,1,3).

Cómo nuestra nueva dimensión nos permite diferentes operaciones:

In [3]:x2 = np.arange(11,20).reshape(3,3)
       print(x2)
Out[3]:array([[11, 12, 13],
              [14, 15, 16],
              [17, 18, 19]]) 

Sumando x1_new y x2, obtenemos:

In [4]:x1_new+x2
Out[4]:array([[[12, 14, 16],
               [15, 17, 19],
               [18, 20, 22]],

              [[15, 17, 19],
               [18, 20, 22],
               [21, 23, 25]],

              [[18, 20, 22],
               [21, 23, 25],
               [24, 26, 28]]])

De este modo, newaxis no es solo la conversión de matriz de fila a columna. Aumenta la dimensión de la matriz, lo que nos permite hacer más operaciones en ella.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad