Numpy: Powinienem używać newaxis czy None?

91

W numpy można użyć obiektu `` newaxis '' w składni wycinania, aby utworzyć oś długości jeden, np:

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

Te stany dokumentacji , które można również stosować Nonezamiast newaxis, efekt jest dokładnie taki sam.

Czy jest jakiś powód, by wybierać jedną z nich? Czy są jakieś ogólne preferencje lub przewodnik po stylu? Mam wrażenie, że newaxisjest bardziej popularny, prawdopodobnie dlatego, że jest bardziej dosadny. Czy jest więc jakiś powód, dla którego Nonejest to dozwolone?

nikow
źródło

Odpowiedzi:

103

Nonejest dozwolone, ponieważ numpy.newaxisjest tylko aliasem dla None.

In [1]: import numpy

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

Autorzy prawdopodobnie wybrali ją, ponieważ potrzebowali wygodnej stałej i Nonebyła dostępna.

Jak dla dlaczego wolisz newaxisprzez None: przede wszystkim dlatego, że jest to bardziej wyraźne, a częściowo dlatego, że pewnego dnia numpyautorów może go zmienić na coś innego niż None. (Nie planują i prawdopodobnie tego nie zrobią, ale nie ma powodu, by woleli None).

AFoglia
źródło
Dzięki, nie zauważyłem, że np.newaxis to właściwie None. W takim razie pójdę z newaxis.
nikow
7
Mówią jednak, że możesz użyć None, więc nie mogą tego teraz zmienić: „Obiekt newaxis może być użyty w podstawowej składni wycinania omówionej powyżej. None może być również użyte zamiast newaxis.”
endolit
5
Również jeśli pracujesz z ludźmi, którzy nie są zaznajomieni ze szczegółami indeksowania numpy, wydaje się, że oszaleli, gdy widzą tablice dereferencjonowane przez „None”
Peter
1
Jednym z miejsc, w których Nonejest lepsza, jest optymalizacja szybkości wykonywania, która może przynieść bardzo niewielką korzyść czasową. Ale zwykle wolisz np.newaxis.
godaygo
2
Dlaczego po prostu nie użyli newaxis = object()(lub odpowiednika na poziomie C), jest poza mną ... używanie Nonejest dość podatne na błędy. Miałem funkcję z błędem (nagą, returnktóra miała zwrócić tablicę logiczną) i zacząłem otrzymywać błędy z powodu niedopasowania kształtu. Zajęło mi trochę czasu, zanim zdałem sobie sprawę, że indeksowanie za pomocą Nonenie po prostu podnosi IndexError. Gdyby użyli „świeżej” wartości wartowniczej, uniknąłbym 30 minut próby zrozumienia błędu ...
Giacomo Alzetta