З підручника Numpy вісь можна проіндексувати цілими числами, як 0
для стовпця, 1
для рядка, але я не розумію, чому вони індексуються таким чином? І як я можу зрозуміти індекс кожної осі, коли справляюся з багатовимірним масивом?
З підручника Numpy вісь можна проіндексувати цілими числами, як 0
для стовпця, 1
для рядка, але я не розумію, чому вони індексуються таким чином? І як я можу зрозуміти індекс кожної осі, коли справляюся з багатовимірним масивом?
Відповіді:
За визначенням, номер осі виміру є індексом цього виміру в масиві 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]
.
Ви можете схопити вісь таким чином:
>>> 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 = 0
ec У масиві
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
.
Взагалі, вісь = 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]]))
0
повинен посилатися на рядки і1
повинен посилатися на стовпці. Я підозрюю, що ви думаєте, наприклад, про те,.sum(axis=0)
які суми вздовж рядків (отримуючи підсумки стовпців).