En pocas palabras, numpy.newaxis
se usa para aumentar la dimensión de la matriz existente en una dimensión más , cuando se usa una vez . Así,
La matriz 1D se convertirá en una matriz 2D
La matriz 2D se convertirá en una matriz 3D
La matriz 3D se convertirá en una matriz 4D
La matriz 4D se convertirá en una matriz 5D
y así..
Aquí hay una ilustración visual que muestra la promoción de una matriz 1D a matrices 2D.
Escenario 1 : np.newaxis
puede ser útil cuando desea convertir explícitamente una matriz 1D en un vector de 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 la transmisión de numpy como parte de alguna operación, por ejemplo, al agregar algunas matrices.
Ejemplo:
Supongamos 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 usar np.newaxis
para aumentar la dimensión de una de las matrices para que NumPy pueda transmitir .
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, puede usar np.newaxis
más de una vez para 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)
Más información sobre np.newaxis vs np.reshape
newaxis
También se llama como un pseudo-índice que permite la adición temporal de un eje en una matriz múltiple.
np.newaxis
usa el operador de corte para recrear la matriz mientras que np.reshape
la forma a la disposición deseada (suponiendo que las dimensiones coincidan; y esto es imprescindible para reshape
que ocurra).
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
(para usar la transmisión). Aquí se rellena un eje que falta np.newaxis
para hacer que la operación de transmisión funcione.
Consejo general : También puede usarNone
en lugar denp.newaxis
; Estos son, de hecho, los mismos objetos .
In [13]: np.newaxis is None
Out[13]: True
PD: vea también esta excelente respuesta: newaxis vs rehape para agregar dimensiones
except that it changes a row vector to a column vector?
El primer ejemplo no es un vector de fila. Ese es un concepto 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