Como está o numpy?newaxis funciona e quando usá-lo?

Quando tento

numpy.newaxis

o resultado dá-me uma moldura de 2-d com o eixo x de 0 a 1. No entanto, quando tento usar numpy.newaxis para cortar um vector,

vector[0:4,]
[ 0.04965172  0.04979645  0.04994022  0.05008303]
vector[:, np.newaxis][0:4,]
[[ 0.04965172]
[ 0.04979645]
[ 0.04994022]
[ 0.05008303]]

é a mesma coisa excepto que muda um vector de linha para um vector de coluna?

de um modo geral, Qual é a utilidade de numpy.newaxis, e em que circunstâncias devemos usá-lo?

Author: kmario23, 2015-03-24

4 answers

Simplificando, o newaxis é usado para aumentar a dimensão da matriz existente por mais uma dimensão, quando usado depois. Assim,

  • A matriz 1D tornar-se-á 2D

  • O array 2D tornar-se-á matriz 3D

  • A matriz 3D tornar-se-á 4D

E assim por diante.. Aqui está um visual ilustracao.

newaxis canva visualization


Cenário-1: np.newaxis pode vir a calhar quando você quer explicitamente converte um array 1D para um linha do vetor ou vetor coluna, como mostrado na imagem 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, :]
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]
In [12]: col_vec.shape
Out[12]: (4, 1)

Cenário-2: Quando queremos fazer uso da [[[91]}numpy broadcasting Como parte de alguma operação, por exemplo, ao fazer adição de algumas matrizes.

Exemplo:

Digamos que quer adicionar as duas seguintes matrizes:
 x1 = np.array([1, 2, 3, 4, 5])
 x2 = np.array([5, 4, 3])

Se você tentar adicionar estes exatamente como este, NumPy vai levantar o seguinte ValueError :

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

Nesta situação, pode usar np.newaxis aumentar a dimensão de uma das matrizes para que o NumPy possa transmitir.

In [2]: x1_new = x1[:, np.newaxis]
# 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]])

Em alternativa, também pode adicionar um novo eixo ao

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]

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

Mais informações sobre np.newaxis vs np.remodelar

newaxis é também chamado como um pseudo-índice que permite a adição temporária de um eixo em um multi-array.

np.newaxis usa o operador de corte para recriar a matriz enquanto np.reshape reformula a matriz para o layout desejado (supondo que as dimensões de correspondência; E esta é a deve para um reshape para acontecer).

Exemplo

In [13]: A = np.ones((3,4,5,6))
In [14]: B = np.ones((4,6))
In [15]: (A + B[:, np.newaxis, :]).shape
Out[15]: (3, 4, 5, 6)
No exemplo acima, inserimos um eixo temporário entre o primeiro e o segundo eixos de B (para usar a radiodifusão). Um eixo em falta é preenchido aqui usando np.newaxis fazer com que a operação de radiodifusão funcione.

Dica Geral: Você também pode usar None em lugar de np.newaxis; Estes são, na verdade, o mesmos objetos.

In [13]: np.newaxis is None
Out[13]: True
P. S. resposta: newaxis vs remodelação para adicionar dimensões
 144
Author: kmario23, 2018-10-03 12:22:27
Começaste com uma lista unidimensional de números. Uma vez que você usou {[[0]}, você transformou-o em uma matriz bidimensional, consistindo de quatro linhas de uma coluna cada.

Você poderia então usar essa matriz para multiplicação de matriz, ou envolvê-la na construção de uma matriz 4 x n Maior.

 7
Author: Kevin, 2015-03-24 20:12:44
O que é isso?

O np.newaxis é apenas um nome falso para a constante de Python None, o que significa que onde quer que use np.newaxis também pode usar None:

>>> np.newaxis is None
True

É apenas mais descritivo se você ler o código que usa np.newaxis em vez de None.

Como utilizar np.newaxis?

O {[8] } é geralmente utilizado com corte. Ele indica que você quer adicionar uma dimensão adicional ao array. A posição do np.newaxis representa onde quero adicionar dimensao.

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

No primeiro exemplo, Uso todos os elementos da primeira dimensão e adiciono uma segunda dimensão:

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

O segundo exemplo adiciona uma dimensão como a primeira dimensão e, em seguida, usa todos os elementos de a primeira dimensão da matriz original, como elementos na segunda dimensão da matriz de resultado:

>>> 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)

Da mesma forma, pode usar o múltiplo np.newaxis para adicionar várias dimensões:

>>> 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)
Existem alternativas a np.newaxis? Há outro. funcionalidade muito semelhante em NumPy: np.expand_dims, que também pode ser usado para inserir uma dimensão:
>>> np.expand_dims(a, 1)  # like a[:, np.newaxis]
>>> np.expand_dims(a, 0)  # like a[np.newaxis, :]

Mas dado que ele apenas insere 1 s no shape Você também pode {[23] } a matriz para adicionar estas dimensões:

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

A maioria das vezes np.newaxis é a maneira mais fácil de adicionar dimensões, mas é bom saber as alternativas.

Quando utilizar np.newaxis?

Em vários contextos está a adicionar dimensões úteis:

  • Se os dados ter um número especificado de dimensões. Por exemplo, se quiser usar matplotlib.pyplot.imshow para mostrar uma lista 1D.

  • Se quiseres que o NumPy transmita os arrays. Adicionando uma dimensão, você pode, por exemplo, obter a diferença entre todos os elementos de um array: a - a[:, np.newaxis]. Isto funciona porque as operações NumPy transmitem a partir da última dimensão 1.

  • Adicionar uma dimensão necessária para que o NumPy possa transmitir matrizes. Isto funciona porque cada comprimento-1 a dimensão é simplesmente transmitida ao comprimento do correspondente1 dimensão da outra matriz.


1 se quiser ler mais sobre as regras de radiodifusão, a documentação sobre esse assunto é muito boa. Também inclui um exemplo com 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.]])
 7
Author: MSeifert, 2018-01-13 18:03:15

newaxis o objecto na tupla de selecção serve para expandir as dimensões da selecção resultante por uma unidade de comprimento dimensão.

Não é apenas a conversão da matriz da linha para a matriz da coluna.

Considere o exemplo abaixo:

In [1]:x1 = np.arange(1,10).reshape(3,3)
       print(x1)
Out[1]: array([[1, 2, 3],
               [4, 5, 6],
               [7, 8, 9]])
Agora vamos adicionar uma nova dimensão aos nossos dados.
In [2]:x1_new = x1[:,np.newaxis]
       print(x1_new)
Out[2]:array([[[1, 2, 3]],

              [[4, 5, 6]],

              [[7, 8, 9]]])

Você pode ver que newaxis adicionou a dimensão extra aqui, x1 tinha dimensão (3,3) e X1_new tem dimensão (3,1,3).

Como a nossa nova dimensão permite-nos diferentes operações:
In [3]:x2 = np.arange(11,20).reshape(3,3)
       print(x2)
Out[3]:array([[11, 12, 13],
              [14, 15, 16],
              [17, 18, 19]]) 

Adicionando x1_new e x2, temos:

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]]])

Assim, newaxis não é apenas a conversão da linha para a matriz da coluna. Aumenta a dimensão da matriz, permitindo-nos assim fazer mais Operações sobre ela.

 3
Author: harsh hundiwala, 2017-10-05 18:26:22