Простіше кажучи, numpy.newaxis
використовується для збільшення розмірності існуючого масиву ще на один вимір , коли використовується один раз . Таким чином,
1D масив стане 2D масивом
2D масив стане 3D- масивом
3D масив стане 4D масивом
4D масив стане 5D масивом
і так далі..
Ось наочна ілюстрація, яка зображує просування 1D масиву до 2D масивів.
Сценарій-1 : np.newaxis
може стати в нагоді, коли ви хочете явно перетворити 1D масив у векторний рядок або вектор стовпця , як зображено на малюнку вище.
Приклад:
# 1D array
In [7]: arr = np.arange(4)
In [8]: arr.shape
Out[8]: (4,)
# make it as row vector by inserting an axis along first dimension
In [9]: row_vec = arr[np.newaxis, :] # arr[None, :]
In [10]: row_vec.shape
Out[10]: (1, 4)
# make it as column vector by inserting an axis along second dimension
In [11]: col_vec = arr[:, np.newaxis] # arr[:, None]
In [12]: col_vec.shape
Out[12]: (4, 1)
Сценарій-2 : Коли ми хочемо використовувати нумероване мовлення як частину якоїсь операції, наприклад, під час додавання деяких масивів.
Приклад:
Скажімо, ви хочете додати наступні два масиви:
x1 = np.array([1, 2, 3, 4, 5])
x2 = np.array([5, 4, 3])
Якщо ви спробуєте додати їх просто так, NumPy створить наступне ValueError
:
ValueError: operands could not be broadcast together with shapes (5,) (3,)
У цій ситуації ви можете використовувати np.newaxis
для збільшення розмірності одного з масивів, щоб NumPy міг транслювати .
In [2]: x1_new = x1[:, np.newaxis] # x1[:, None]
# now, the shape of x1_new is (5, 1)
# array([[1],
# [2],
# [3],
# [4],
# [5]])
Тепер додайте:
In [3]: x1_new + x2
Out[3]:
array([[ 6, 5, 4],
[ 7, 6, 5],
[ 8, 7, 6],
[ 9, 8, 7],
[10, 9, 8]])
Крім того, ви можете також додати нову вісь до масиву x2
:
In [6]: x2_new = x2[:, np.newaxis] # x2[:, None]
In [7]: x2_new # shape is (3, 1)
Out[7]:
array([[5],
[4],
[3]])
Тепер додайте:
In [8]: x1 + x2_new
Out[8]:
array([[ 6, 7, 8, 9, 10],
[ 5, 6, 7, 8, 9],
[ 4, 5, 6, 7, 8]])
Примітка : зауважте, що ми отримуємо однаковий результат в обох випадках (але один є перенесенням іншого).
Сценарій-3 : Це схоже на сценарій-1. Але ви можете використовувати np.newaxis
не раз для просування масиву до більш високих розмірів. Така операція іноді потрібна для масивів вищого порядку ( тобто тензорів ).
Приклад:
In [124]: arr = np.arange(5*5).reshape(5,5)
In [125]: arr.shape
Out[125]: (5, 5)
# promoting 2D array to a 5D array
In [126]: arr_5D = arr[np.newaxis, ..., np.newaxis, np.newaxis] # arr[None, ..., None, None]
In [127]: arr_5D.shape
Out[127]: (1, 5, 5, 1, 1)
Більше інформації про np.newaxis vs np.reshape
newaxis
також називається псевдоіндексом, що дозволяє тимчасово додавати вісь у багатомагнітний масив.
np.newaxis
використовує оператор нарізки, щоб відтворити масив, np.reshape
перетворюючи масив на потрібний макет (якщо вважати, що розміри відповідають; І це необхідно, щоб це reshape
відбулося).
Приклад
In [13]: A = np.ones((3,4,5,6))
In [14]: B = np.ones((4,6))
In [15]: (A + B[:, np.newaxis, :]).shape # B[:, None, :]
Out[15]: (3, 4, 5, 6)
У наведеному вище прикладі ми вставили тимчасову вісь між першою та другою осями B
(для використання мовлення). Тут заповнюється відсутність осі, яка використовується np.newaxis
для того, щоб операція мовлення працювала.
Загальна порада : Ви також можете використовуватиNone
замістьnp.newaxis
; Це насправді ті самі об’єкти .
In [13]: np.newaxis is None
Out[13]: True
PS Також дивіться цю чудову відповідь: newaxis vs переформатувати для додавання розмірів
except that it changes a row vector to a column vector?
Перший приклад - це не рядковий вектор. Це концепція matlab. У python це просто одновимірний вектор без поняття рядка чи стовпця. Рядкові або стовпчикові вектори є двовимірними, як і другий приклад