Numpy: Soll ich newaxis oder None verwenden?

89

In numpy kann man das 'newaxis'-Objekt in der Slicing-Syntax verwenden, um eine Achse der Länge eins zu erstellen, z.

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

Die Dokumentation besagt, dass man Nonestattdessen auch verwenden kann newaxis, der Effekt ist genau der gleiche.

Gibt es einen Grund, einen über den anderen zu wählen? Gibt es eine allgemeine Präferenz oder einen Styleguide? Mein Eindruck ist, dass dies newaxispopulärer ist, wahrscheinlich weil es expliziter ist. Gibt es einen Grund, warum dies Noneerlaubt ist?

Nikow
quelle

Antworten:

101

Noneist erlaubt, weil numpy.newaxises nur ein Alias ​​für ist None.

In [1]: import numpy

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

Die Autoren haben es wahrscheinlich gewählt, weil sie eine bequeme Konstante brauchten und Noneverfügbar waren.

Was , warum Sie es vorziehen sollten newaxisüber None: vor allem ist es , weil es deutlicher ist, und zum Teil , weil irgendwann die numpyAutoren könnte es auf etwas anderes ändern , als None. (Sie planen es nicht und werden es wahrscheinlich auch nicht, aber es gibt keinen guten Grund, es vorzuziehen None.)

AFoglia
quelle
Danke, ich hatte nicht bemerkt, dass np.newaxis eigentlich None ist. Ich werde dann mit Newaxis gehen.
Nikow
6
Sie sagen jedoch tatsächlich, dass Sie None verwenden können, sodass sie es jetzt nicht ändern können: "Das newaxis-Objekt kann in der oben beschriebenen grundlegenden Slicing-Syntax verwendet werden. None kann auch anstelle von newaxis verwendet werden."
Endolith
5
Auch wenn Sie mit Leuten arbeiten, die mit den Details der Numpy-Indizierung nicht vertraut sind, scheinen sie verrückt zu werden, wenn sie Arrays sehen, die von "None" dereferenziert werden
Peter
1
Ein Ort, an dem Nonees besser ist, ist die Optimierung der Ausführungsgeschwindigkeit. Dies kann einen sehr geringen Zeitvorteil bringen. Aber normalerweise solltest du es vorziehen np.newaxis.
Godaygo
2
Warum sie einfach nicht verwendet haben newaxis = object()(oder das C-Level-Äquivalent), ist mir ein Rätsel ... die Verwendung Noneist ziemlich fehleranfällig. Ich hatte eine Funktion mit einem Fehler (ein Bare return, der ein boolesches Array zurückgeben sollte) und bekam Fehler aufgrund von Formfehlanpassungen. Es hat eine Weile gedauert, bis mir klar wurde, dass die Indizierung mit Nonenicht einfach eine erhöht IndexError. Wenn sie einen "frischen" Sentinel-Wert verwendet hätten, hätte ich 30 Minuten vermieden, um zu versuchen, den Fehler zu
verstehen