Як працює numpy.newaxis і коли ним користуватися?


186

Коли я намагаюся

numpy.newaxis

результат дає мені дводенний графічний кадр з віссю x від 0 до 1. Однак, коли я намагаюся використовувати 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
except that it changes a row vector to a column vector? Перший приклад - це не рядковий вектор. Це концепція matlab. У python це просто одновимірний вектор без поняття рядка чи стовпця. Рядкові або стовпчикові вектори є двовимірними, як і другий приклад
ендоліт

Відповіді:


329

Простіше кажучи, numpy.newaxisвикористовується для збільшення розмірності існуючого масиву ще на один вимір , коли використовується один раз . Таким чином,

  • 1D масив стане 2D масивом

  • 2D масив стане 3D- масивом

  • 3D масив стане 4D масивом

  • 4D масив стане 5D масивом

і так далі..

Ось наочна ілюстрація, яка зображує просування 1D масиву до 2D масивів.

візуалізація полотна newaxis


Сценарій-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 переформатувати для додавання розмірів


3
Який тип операції x1_new + x2? Мені це дивно, тому що я думав, що дві матриці можна додати лише в тому випадку, якщо вони мають однакові розміри (або якщо одна з них насправді просто скаляр).
Стівен

2
@Stephen Як я також зазначив у відповіді, це через NumPy Broadcasting.
kmario23

2
Це дивовижне пояснення
Вальдріній

2
@valdrinit рада, що вам це корисно :)
kmario23

1
@ kmario23 Насправді атрибуція прихована в останньому реченні статті, недарма я її не бачив. Я вважаю це прикордонним плагіатом навіть з цією атрибуцією. У моїй книзі копіювання слів у слово прийнятне лише в тому випадку, якщо це той самий автор, який публікує на різних платформах. Я очікував кращого від Середнього.
Chiraz BenAbdelkader

29

Що таке np.newaxis?

Це np.newaxisлише псевдонім для константи Python None, а це означає, що де б ви не використовувались, np.newaxisви також можете використовувати None:

>>> np.newaxis is None
True

Це просто більш описово, якщо ви читаєте код, який використовується 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, :]

Але з огляду на те, що він просто вставляє 1s у 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для відображення 1D-масиву.

  • Якщо ви хочете, щоб 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.]])

Я не бачу різниці між 2-м та 3-м випадками використання; вони обидва дозволяють NumPy транслювати масив як частину якоїсь операції. Якщо ні, то це допоможе додати приклад для випадку 3-го використання, щоб уточнити точку.
Chiraz BenAbdelkader

@ChirazBenAbdelkader Так, відмінність насправді не така виразна. Я не впевнений, чи повинен я видалити третю точку чи об'єднати її у другу.
MSeifert

9

Ви почали з одновимірного списку чисел. Після використання numpy.newaxisви перетворили його на двовимірну матрицю, що складається з чотирьох рядків одного стовпчика кожен.

Потім ви можете використовувати цю матрицю для множення матриці або залучити її до побудови більшої матриці 4 xn.


5

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це не просто перетворення рядка в матрицю стовпців. Це збільшує розмірність матриці, тим самим дозволяє нам робити більше операцій над нею.


1
Це не просто матриця, вона працює з будь-якою ndarrayтермінологією NumPy.
kmario23
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.