Mówiąc najprościej, numpy.newaxis
służy do zwiększenia wymiaru istniejącej tablicy o jeden dodatkowy wymiar , gdy zostanie użyty raz . A zatem,
Macierz 1D stanie się macierzą 2D
Tablica 2D stanie się tablicą 3D
Tablica 3D stanie się tablicą 4D
Tablica 4D stanie się tablicą 5D
i tak dalej..
Oto wizualna ilustracja, która przedstawia promocję macierzy 1D na tablice 2D.
Scenariusz 1 : np.newaxis
może się przydać, gdy chcesz jawnie przekonwertować tablicę 1D na wektor wierszowy lub wektor kolumnowy , jak pokazano na powyższym obrazku.
Przykład:
In [7]: arr = np.arange(4)
In [8]: arr.shape
Out[8]: (4,)
In [9]: row_vec = arr[np.newaxis, :]
In [10]: row_vec.shape
Out[10]: (1, 4)
In [11]: col_vec = arr[:, np.newaxis]
In [12]: col_vec.shape
Out[12]: (4, 1)
Scenariusz-2 : Gdy chcemy wykorzystać emisję numpy jako część jakiejś operacji, na przykład podczas dodawania niektórych tablic.
Przykład:
Powiedzmy, że chcesz dodać następujące dwie tablice:
x1 = np.array([1, 2, 3, 4, 5])
x2 = np.array([5, 4, 3])
Jeśli spróbujesz dodać je po prostu w ten sposób, NumPy podniesie następujące wartości ValueError
:
ValueError: operands could not be broadcast together with shapes (5,) (3,)
W tej sytuacji możesz użyć, np.newaxis
aby zwiększyć wymiar jednej z tablic, aby NumPy mógł rozgłaszać .
In [2]: x1_new = x1[:, np.newaxis]
Teraz dodaj:
In [3]: x1_new + x2
Out[3]:
array([[ 6, 5, 4],
[ 7, 6, 5],
[ 8, 7, 6],
[ 9, 8, 7],
[10, 9, 8]])
Alternatywnie możesz również dodać nową oś do tablicy x2
:
In [6]: x2_new = x2[:, np.newaxis]
In [7]: x2_new
Out[7]:
array([[5],
[4],
[3]])
Teraz dodaj:
In [8]: x1 + x2_new
Out[8]:
array([[ 6, 7, 8, 9, 10],
[ 5, 6, 7, 8, 9],
[ 4, 5, 6, 7, 8]])
Uwaga : Zauważ, że otrzymujemy ten sam wynik w obu przypadkach (ale jeden jest transpozycją drugiego).
Scenariusz 3 : jest podobny do scenariusza 1. Ale możesz użyć np.newaxis
więcej niż jeden raz, aby promować tablicę do wyższych wymiarów. Taka operacja jest czasami potrzebna w przypadku tablic wyższego rzędu ( tj. Tensorów ).
Przykład:
In [124]: arr = np.arange(5*5).reshape(5,5)
In [125]: arr.shape
Out[125]: (5, 5)
In [126]: arr_5D = arr[np.newaxis, ..., np.newaxis, np.newaxis]
In [127]: arr_5D.shape
Out[127]: (1, 5, 5, 1, 1)
Alternatywnie możesz użyć numpy.expand_dims
intuicyjnego axis
kwarg.
In [131]: newaxes = (0, 3, -1)
In [132]: arr_5D = np.expand_dims(arr, axis=newaxes)
In [133]: arr_5D.shape
Out[133]: (1, 5, 5, 1, 1)
Więcej informacji na temat np.newaxis vs np.reshape
newaxis
jest również nazywany pseudoindeksem, który umożliwia tymczasowe dodanie osi do multiarray.
np.newaxis
używa operatora wycinania, aby odtworzyć tablicę, jednocześnie numpy.reshape
zmieniając jej kształt na żądany układ (zakładając, że wymiary są zgodne; I to musi się reshape
wydarzyć).
Przykład
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)
W powyższym przykładzie wstawiliśmy tymczasową oś między pierwszą a drugą osią B
(do wykorzystania nadawania). Brakująca oś jest tutaj wypełniana za pomocą, np.newaxis
aby operacja nadawania działała.
Wskazówka ogólna : możesz również użyćNone
zamiastnp.newaxis
; W rzeczywistości są to te same obiekty .
In [13]: np.newaxis is None
Out[13]: True
PS Zobacz także tę świetną odpowiedź: newaxis vs zmiana kształtu, aby dodać wymiary
except that it changes a row vector to a column vector?
Pierwszy przykład nie jest wektorem wierszowym. To jest koncepcja Matlab. W Pythonie jest to tylko 1-wymiarowy wektor bez koncepcji wiersza lub kolumny. Wektory wierszowe lub kolumnowe są 2-wymiarowe, tak jak w drugim przykładzie