як індексується вісь у масиві numpy?


81

З підручника Numpy вісь можна проіндексувати цілими числами, як 0для стовпця, 1для рядка, але я не розумію, чому вони індексуються таким чином? І як я можу зрозуміти індекс кожної осі, коли справляюся з багатовимірним масивом?


16
0повинен посилатися на рядки і 1повинен посилатися на стовпці. Я підозрюю, що ви думаєте, наприклад, про те, .sum(axis=0)які суми вздовж рядків (отримуючи підсумки стовпців).
nneonneo

@nneonneo, так, це те, що я маю на увазі, так як я можу знати індекс кожної осі?
Alcott

Відповіді:


142

За визначенням, номер осі виміру є індексом цього виміру в масиві shape. Це також позиція, яка використовується для доступу до цього виміру під час індексації.

Наприклад, якщо 2D-масив aмає форму (5,6), ви можете отримати доступ a[0,0]до a[4,5]. Ось 0, таким чином, є першим виміром ("рядки"), а вісь 1 - другим виміром ("стовпці"). У більш високих вимірах, де «рядок» і «стовпець» перестають мати справді сенс, спробуйте думати про осі з точки зору фігур та показників, що беруть участь.

.sum(axis=n)Наприклад, якщо ви це зробите , розмірність nзгортається та видаляється, при цьому кожне значення в новій матриці дорівнює сумі відповідних згорнутих значень. Наприклад, якщо bмає фігуру (5,6,7,8), а ви маєте c = b.sum(axis=2), тоді вісь 2 (розмірність із розміром 7) згортається, і результат має форму (5,6,8). Крім того, c[x,y,z]дорівнює сумі всіх елементів b[x,y,:,z].


для цього масиву (5,6,8) дорівнює 5 кількість рядків або 6? як ти це візуалізуєш? рядки стовпці глибина? або глибина рядків стовпців?
PirateApp

1
@PirateApp, як я вже говорив, трохи важко застосувати ці терміни до 3D-масиву. Позиція каналу "глибина" залежить від програми та домовленостей - іноді це 0, іноді 2, іноді взагалі немає сенсу мати канал "глибини".
nneonneo


17

Ви можете схопити вісь таким чином:

>>> a = np.array([[[1,2,3],[2,2,3]],[[2,4,5],[1,3,6]],[[1,2,4],[2,3,4]],[[1,2,4],[1,2,6]]])
array([[[1, 2, 3],
    [2, 2, 3]],

   [[2, 4, 5],
    [1, 3, 6]],

   [[1, 2, 4],
    [2, 3, 4]],

   [[1, 2, 4],
    [1, 2, 6]]])
>>> a.shape
(4,2,3)

Я створив масив фігури з різними значеннями, (4,2,3)щоб ви могли чітко визначити структуру. Різна вісь означає різний "шар".

Тобто axis = 0індексуйте перший вимір фігури (4,2,3). Це стосується масивів у першій []. У ньому 4 елементи, тому його форма 4:

  array[[1, 2, 3],
        [2, 2, 3]],

  array[[2, 4, 5],
        [1, 3, 6]],

  array[[1, 2, 4],
        [2, 3, 4]],

  array[[1, 2, 4],
        [1, 2, 6]]

axis = 1індексує другий вимір у формі (4,2,3). У кожному масиві шару є 2 елементи:, axis = 0ec У масиві

 array[[1, 2, 3],
       [2, 2, 3]]

. Два елементи:

array[1, 2, 3]

array[2, 2, 3]

І третє значення форми означає , що є 3 елементи в кожному елементі масиву шару: axis = 2. ec Є 3 елементи в array[1, 2, 3]. Це явно.

А також, ви можете визначити вісь / розміри за кількістю []на початку або в кінці. У цьому випадку число дорівнює 3 ( [[[), тож ви можете вибрати axisз axis = 0, axis = 1і axis = 2.


6

Взагалі, вісь = 0, означає всі клітинки з першим виміром, що змінюється з кожним значенням 2-го виміру та 3-го виміру тощо

Наприклад, двовимірний масив має дві відповідні осі: перша проходить вертикально вниз по рядах (вісь 0), а друга, що проходить горизонтально через стовпці (вісь 1)

Для 3D він стає складним, тому використовуйте множину для циклів

>>> x = np.array([[[ 0,  1,  2],
    [ 3,  4,  5],
    [ 6,  7,  8]],
   [[ 9, 10, 11],
    [12, 13, 14],
    [15, 16, 17]],
   [[18, 19, 20],
    [21, 22, 23],
    [24, 25, 26]]])

>>> x.shape #(3, 3, 3)

#axis = 0 
>>> for j in range(0, x.shape[1]):
      for k in range(0, x.shape[2]):
        print( "element = ", (j,k), " ", [ x[i,j,k] for i in range(0, x.shape[0]) ])
...
element =  (0, 0)   [0, 9, 18]             #sum is 27
element =  (0, 1)   [1, 10, 19]            #sum is 30
element =  (0, 2)   [2, 11, 20]
element =  (1, 0)   [3, 12, 21]
element =  (1, 1)   [4, 13, 22]
element =  (1, 2)   [5, 14, 23]
element =  (2, 0)   [6, 15, 24]
element =  (2, 1)   [7, 16, 25]
element =  (2, 2)   [8, 17, 26]

>>> x.sum(axis=0)            
array([[27, 30, 33],
       [36, 39, 42],
       [45, 48, 51]])

#axis = 1    
for i in range(0, x.shape[0]):
    for k in range(0, x.shape[2]):
        print( "element = ", (i,k), " ", [ x[i,j,k] for j in range(0, x.shape[1]) ])

element =  (0, 0)   [0, 3, 6]      #sum is 9 
element =  (0, 1)   [1, 4, 7]
element =  (0, 2)   [2, 5, 8]
element =  (1, 0)   [9, 12, 15]
element =  (1, 1)   [10, 13, 16]
element =  (1, 2)   [11, 14, 17]
element =  (2, 0)   [18, 21, 24]
element =  (2, 1)   [19, 22, 25]
element =  (2, 2)   [20, 23, 26]

# for sum, axis is the first keyword, so we may omit it,

>>> x.sum(0), x.sum(1), x.sum(2)
(array([[27, 30, 33],
        [36, 39, 42],
        [45, 48, 51]]),
 array([[ 9, 12, 15],
        [36, 39, 42],
        [63, 66, 69]]),
 array([[ 3, 12, 21],
        [30, 39, 48],
        [57, 66, 75]]))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.