Проще говоря, numpy.newaxis
используется для увеличения размера существующего массива еще на одно измерение , когда используется один раз . Таким образом,
1D массив станет 2D массивом
2D массив станет 3D массивом
3D массив станет 4D массивом
Массив 4D станет массивом 5D
и так далее..
Вот наглядная иллюстрация, которая изображает продвижение 1D массива в 2D массивы.
Сценарий 1 : np.newaxis
может пригодиться, если вы хотите явно преобразовать одномерный массив в вектор-строку или вектор-столбец , как показано на рисунке выше.
Пример:
# 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 reshape, чтобы добавить размеры
except that it changes a row vector to a column vector?
Первый пример не является вектором строк. Это концепция Matlab. В питоне это просто одномерный вектор без понятия строки или столбца. Векторы строки или столбца являются 2-мерными, как и во втором примере