Из Учебник Numpy ось может быть проиндексирована целыми числами, например 0
для столбца, 1
для строки, но я не понимаю, почему они индексируются таким образом? И как определить показатель каждой оси при работе с многомерным массивом?
Как индексируется ось в массиве numpy?
Ответ 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]
равно сумме всех элементов c[x,y,:,z]
.
Ответ 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]]))
Ответ 3
Вы можете захватить ось таким образом:
>>> 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,3,2)
. В каждом массиве слоя есть 2 элемента: axis = 0
, e.c. В массиве
array[[1, 2, 3],
[2, 2, 3]]
. Эти два элемента:
array[1, 2, 3]
array[2, 2, 3]
И третье значение формы означает, что в каждом элементе массива слоя есть 3 элемента: axis = 2
. исполнительный комитет В array[1, 2, 3]
есть 3 элемента. Это явно.
А также вы можете определить ось/размеры от числа []
в начале или в конце. В этом случае число равно 3 ([[[
), поэтому вы можете выбрать axis
из axis = 0
, axis = 1
и axis = 2
.