Как работает numpy.newaxis и когда его использовать?
Когда я пытаюсь
numpy.newaxis
результат дает мне numpy.newaxis
график с осью х от 0 до 1. Однако, когда я пытаюсь использовать numpy.newaxis
для numpy.newaxis
вектора,
vector[0:4,]
[ 0.04965172 0.04979645 0.04994022 0.05008303]
vector[:, np.newaxis][0:4,]
[[ 0.04965172]
[ 0.04979645]
[ 0.04994022]
[ 0.05008303]]
Это то же самое, за исключением того, что он заменяет вектор строки на вектор столбца?
Какова польза от numpy.newaxis
и при каких обстоятельствах мы должны его использовать?
Ответы
Ответ 1
Проще говоря, newaxis
используется для увеличения размера существующего массива еще на одно измерение, когда используется один раз. Таким образом,
-
1D массив станет 2D массивом
-
2D массив станет 3D массивом
-
3D массив станет 4D массивом
-
Массив 4D станет массивом 5D
и так далее..
Вот наглядная иллюстрация, которая изображает продвижение 1D массива в 2D массивы.
![newaxis canva visualization]()
Сценарий 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
более одного раза, чтобы 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
ось здесь заполняется с помощью np.newaxis
чтобы заставить работать трансляцию.
Общий совет: Вы также можете использовать None
вместо np.newaxis
; На самом деле это одни и те же объекты.
In [13]: np.newaxis is None
Out[13]: True
PS Также см. Этот замечательный ответ: newaxis vs reshape, чтобы добавить размеры
Ответ 2
Что такое np.newaxis
?
np.newaxis
- это просто псевдоним константы Python None
, что означает, что везде, где вы используете np.newaxis
вы также можете использовать None
:
>>> np.newaxis is None
True
Это просто более np.newaxis
если вы читаете код, который использует np.newaxis
вместо None
.
Как использовать np.newaxis
?
np.newaxis
обычно используется с нарезкой. Это указывает на то, что вы хотите добавить дополнительное измерение в массив. Положение np.newaxis
представляет собой место, где я хочу добавить размеры.
>>> import numpy as np
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a.shape
(10,)
В первом примере я использую все элементы из первого измерения и добавляю второе измерение:
>>> a[:, np.newaxis]
array([[0],
[1],
[2],
[3],
[4],
[5],
[6],
[7],
[8],
[9]])
>>> a[:, np.newaxis].shape
(10, 1)
Второй пример добавляет измерение в качестве первого измерения, а затем использует все элементы из первого измерения исходного массива в качестве элементов во втором измерении результирующего массива:
>>> a[np.newaxis, :] # The output has 2 [] pairs!
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
>>> a[np.newaxis, :].shape
(1, 10)
Точно так же вы можете использовать несколько np.newaxis
для добавления нескольких измерений:
>>> a[np.newaxis, :, np.newaxis] # note the 3 [] pairs in the output
array([[[0],
[1],
[2],
[3],
[4],
[5],
[6],
[7],
[8],
[9]]])
>>> a[np.newaxis, :, np.newaxis].shape
(1, 10, 1)
Есть ли альтернативы np.newaxis
?
В NumPy есть еще одна очень похожая функциональность: np.expand_dims
, которую также можно использовать для вставки одного измерения:
>>> np.expand_dims(a, 1) # like a[:, np.newaxis]
>>> np.expand_dims(a, 0) # like a[np.newaxis, :]
Но, учитывая, что он просто вставляет 1
в shape
вы также можете reshape
массива, добавив следующие размеры:
>>> a.reshape(a.shape + (1,)) # like a[:, np.newaxis]
>>> a.reshape((1,) + a.shape) # like a[np.newaxis, :]
В большинстве случаев np.newaxis
- это самый простой способ добавления измерений, но полезно знать альтернативы.
Когда использовать np.newaxis
?
В нескольких контекстах добавление измерений полезно:
-
Если данные должны иметь указанное количество измерений. Например, если вы хотите использовать matplotlib.pyplot.imshow
для отображения одномерного массива.
-
Если вы хотите, чтобы NumPy транслировал массивы. Добавив измерение, вы можете, например, получить разницу между всеми элементами одного массива: a - a[:, np.newaxis]
. Это работает, потому что операции NumPy передаются, начиная с последнего измерения 1.
-
Чтобы добавить необходимое измерение, чтобы NumPy мог транслировать массивы. Это работает, потому что каждая длина-1 измерение просто транслируется на длину соответствующего 1 размерность другого массива.
1 Если вы хотите узнать больше о правилах вещания, документация NumPy по этому вопросу очень хороша. Он также включает пример с np.newaxis
:
>>> a = np.array([0.0, 10.0, 20.0, 30.0])
>>> b = np.array([1.0, 2.0, 3.0])
>>> a[:, np.newaxis] + b
array([[ 1., 2., 3.],
[ 11., 12., 13.],
[ 21., 22., 23.],
[ 31., 32., 33.]])
Ответ 3
Вы начали с одномерного списка чисел. Когда вы использовали numpy.newaxis
, вы превратили его в двумерную матрицу, состоящую из четырех строк по одному столбцу.
Затем вы можете использовать эту матрицу для матричного умножения или включить ее в построение большей 4 x n -матрицы.
Ответ 4
newaxis
объект в кортеже выбора служит для расширения размеров полученного результата с помощью измерения одной единицы длины.
Это не просто преобразование матрицы строк в матрицу столбцов.
Рассмотрим пример ниже:
In [1]:x1 = np.arange(1,10).reshape(3,3)
print(x1)
Out[1]: array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
Теперь добавим новое измерение в наши данные,
In [2]:x1_new = x1[:,np.newaxis]
print(x1_new)
Out[2]:array([[[1, 2, 3]],
[[4, 5, 6]],
[[7, 8, 9]]])
Вы можете видеть, что newaxis
добавил дополнительное измерение здесь, x1 имел размерность (3,3) и X1_new имеет размерность (3,1,3).
Как наше новое измерение позволяет нам выполнять разные операции:
In [3]:x2 = np.arange(11,20).reshape(3,3)
print(x2)
Out[3]:array([[11, 12, 13],
[14, 15, 16],
[17, 18, 19]])
Добавив x1_new и x2, получим:
In [4]:x1_new+x2
Out[4]:array([[[12, 14, 16],
[15, 17, 19],
[18, 20, 22]],
[[15, 17, 19],
[18, 20, 22],
[21, 23, 25]],
[[18, 20, 22],
[21, 23, 25],
[24, 26, 28]]])
Таким образом, newaxis
- это не просто преобразование матрицы строк в столбец. Он увеличивает размерность матрицы, что позволяет нам делать больше операций над ней.