Simplificando, numpy.newaxis
é usado para aumentar a dimensão da matriz existente em mais uma dimensão , quando usado uma vez . Portanto,
Matriz 1D se tornará matriz 2D
Matriz 2D se tornará matriz 3D
Matriz 3D se tornará matriz 4D
Matriz 4D se tornará matriz 5D
e assim por diante..
Aqui está uma ilustração visual que mostra a promoção da matriz 1D para matrizes 2D.
Cenário-1 : np.newaxis
pode ser útil quando você deseja converter explicitamente uma matriz 1D em um vetor de linha ou vetor de coluna , conforme mostrado na figura acima.
Exemplo:
# 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)
Cenário 2 : Quando queremos usar a transmissão numpy como parte de alguma operação, por exemplo, ao adicionar algumas matrizes.
Exemplo:
Digamos que você queira adicionar as duas matrizes a seguir:
x1 = np.array([1, 2, 3, 4, 5])
x2 = np.array([5, 4, 3])
Se você tentar adicioná-los assim, o NumPy aumentará o seguinte ValueError
:
ValueError: operands could not be broadcast together with shapes (5,) (3,)
Nessa situação, você pode usar np.newaxis
para aumentar a dimensão de uma das matrizes para que o NumPy possa 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]])
Agora adicione:
In [3]: x1_new + x2
Out[3]:
array([[ 6, 5, 4],
[ 7, 6, 5],
[ 8, 7, 6],
[ 9, 8, 7],
[10, 9, 8]])
Como alternativa, você também pode adicionar um novo eixo à 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]])
Agora adicione:
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 obtemos o mesmo resultado nos dois casos (mas um é a transposição do outro).
Cenário-3 : É semelhante ao cenário-1. Porém, você pode usar np.newaxis
mais de uma vez para promover a matriz para dimensões mais altas. Essa operação às vezes é necessária para matrizes de ordem superior ( ou seja, tensores ).
Exemplo:
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)
Mais informações sobre np.newaxis vs np.reshape
newaxis
também é chamado de pseudo-índice que permite a adição temporária de um eixo em uma multiarray.
np.newaxis
usa o operador de fatiamento para recriar a matriz enquanto np.reshape
modela a matriz para o layout desejado (assumindo que as dimensões correspondam; e isso é necessário para reshape
que isso aconteça).
Exemplo
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)
No exemplo acima, inserimos um eixo temporário entre o primeiro e o segundo eixo de B
(para usar a transmissão). Um eixo ausente é preenchido aqui usando np.newaxis
para fazer a operação de transmissão funcionar.
Dica geral : Você também pode usarNone
no lugar denp.newaxis
; Estes são de fato os mesmos objetos .
In [13]: np.newaxis is None
Out[13]: True
PS Veja também esta ótima resposta: newaxis vs remodelar para adicionar dimensões
except that it changes a row vector to a column vector?
O primeiro exemplo não é um vetor de linha. Esse é um conceito do Matlab. Em python, é apenas um vetor unidimensional sem conceito de linha ou coluna. Vectores de linhas ou colunas são 2-dimensonal, como o segundo exemplo