Numpy: Dois-je utiliser newaxis ou None?

91

Dans numpy, on peut utiliser l'objet 'newaxis' dans la syntaxe de découpage pour créer un axe de longueur un, par exemple:

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

La documentation indique que l'on peut également utiliser à la Noneplace de newaxis, l'effet est exactement le même.

Y a-t-il une raison de choisir l'un plutôt que l'autre? Existe-t-il une préférence générale ou un guide de style? J'ai l'impression que newaxisc'est plus populaire, probablement parce que c'est plus explicite. Alors, y a-t-il une raison pour laquelle Noneest autorisé?

nikow
la source

Réponses:

103

Noneest autorisé car il numpy.newaxiss'agit simplement d'un alias pour None.

In [1]: import numpy

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

Les auteurs l'ont probablement choisi parce qu'ils avaient besoin d'une constante pratique et qu'elle Noneétait disponible.

Quant à savoir pourquoi vous devriez préférer newaxisà None: c'est principalement parce que c'est plus explicite, et en partie parce qu'un jour les numpyauteurs pourraient le changer en autre chose que None. (Ils n'en ont pas l'intention et ne le feront probablement pas, mais il n'y a aucune bonne raison de préférer None.)

AFoglie
la source
Merci, je n'avais pas remarqué que np.newaxis est en fait None. J'irai alors avec newaxis.
nikow
7
Ils disent en fait que vous pouvez utiliser None, donc ils ne peuvent pas le changer maintenant: "L'objet newaxis peut être utilisé dans la syntaxe de découpage de base décrite ci-dessus. Aucun peut également être utilisé à la place de newaxis."
endolith
5
De plus, si vous travaillez avec des personnes qui ne connaissent pas les détails de l'indexation numpy, elles semblent devenir folles quand elles voient des tableaux déréférencés par "Aucun"
Peter
1
L’ Noneoptimisation de la vitesse d’exécution est l’un des meilleurs endroits , ce qui peut donner un très petit gain de temps. Mais généralement, vous devriez préférer np.newaxis.
godaygo
2
Pourquoi ils n'ont tout simplement pas utilisé newaxis = object()(ou l'équivalent de niveau C) me dépasse ... l'utilisation Noneest assez sujette aux erreurs. J'avais une fonction avec un bug (un bare returnqui était censé renvoyer un tableau booléen) et j'ai commencé à avoir des erreurs en raison d'une incompatibilité de forme. Il m'a fallu un certain temps pour réaliser que l'indexation avec Nonene soulève pas simplement un IndexError. S'ils avaient utilisé une valeur sentinelle «fraîche», j'aurais évité 30 minutes d'essayer de comprendre l'erreur ...
Giacomo Alzetta