Numpy: Devo usar newaxis ou nenhum?

91

Em numpy, pode-se usar o objeto 'newaxis' na sintaxe de fatiamento para criar um eixo de comprimento um, por exemplo:

import numpy as np
print np.zeros((3,5))[:,np.newaxis,:].shape
# shape will be (3,1,5)

A documentação afirma que também se pode usar em Nonevez de newaxis, o efeito é exatamente o mesmo.

Existe alguma razão para escolher um em vez do outro? Existe alguma preferência geral ou guia de estilo? Minha impressão é que newaxisé mais popular, provavelmente porque é mais explícito. Então, há alguma razão para que Noneseja permitido?

Nikow
fonte

Respostas:

103

Noneé permitido porque numpy.newaxisé apenas um apelido para None.

In [1]: import numpy

In [2]: numpy.newaxis is None
Out[2]: True

Os autores provavelmente o escolheram porque precisavam de uma constante conveniente e Noneestava disponível.

Quanto ao porquê você deve preferir newaxismais None: principalmente é porque é mais explícita, e em parte porque um dia os numpyautores pode alterá-lo para algo diferente None. (Eles não estão planejando e provavelmente não farão, mas não há um bom motivo para preferir None.)

AFoglia
fonte
Obrigado, não tinha percebido que np.newaxis é, na verdade, Nenhum. Eu irei com newaxis então.
nikow
7
Na verdade, eles dizem que você pode usar None, portanto, não podem alterá-lo agora: "O objeto newaxis pode ser usado na sintaxe básica de fatiamento discutida acima. Nenhum também pode ser usado em vez de newaxis."
endolith
5
Além disso, se você trabalhar com pessoas que não estão familiarizadas com os detalhes da indexação entorpecida, elas parecem enlouquecer quando veem matrizes desreferenciadas por "Nenhum"
Peter
1
Um lugar em que Noneé melhor é a otimização da velocidade de execução, ela pode fornecer um benefício de tempo muito pequeno. Mas normalmente você deve preferir np.newaxis.
godaygo
2
Por que eles simplesmente não usaram newaxis = object()(ou o equivalente de nível C) está além da minha compreensão ... usar Noneé bastante sujeito a erros. Eu tinha uma função com um bug (um bare returnque deveria retornar um array booleano) e comecei a receber erros devido à incompatibilidade de forma. Levei um tempo para perceber que a indexação com Nonenão simplesmente levanta um IndexError. Se eles tivessem usado um valor de sentinela "fresco", eu evitei 30 minutos tentando entender o erro ...
Giacomo Alzetta