Как работает параметр оси из NumPy?

Может кто-нибудь объяснить, что делает параметр axis в NumPy?

Я ужасно смущен.

Я пытаюсь использовать функцию myArray.sum(axis=num)

Сначала я думал, что если массив сам по себе является 3 измерениями, axis=0 вернет три элемента, состоящие из суммы всех вложенных элементов в этой же позиции. Если каждое измерение содержало пять измерений, я ожидал, что axis=1 вернет результат из пяти элементов и так далее.

Однако это не так, и документация не помогает мне помочь (они используют массив 3x3x3, поэтому трудно сказать, что происходит )

Вот что я сделал:

>>> e
array([[[1, 0],
        [0, 0]],

       [[1, 1],
        [1, 0]],

       [[1, 0],
        [0, 1]]])
>>> e.sum(axis = 0)
array([[3, 1],
       [1, 1]])
>>> e.sum(axis=1)
array([[1, 0],
       [2, 1],
       [1, 1]])
>>> e.sum(axis=2)
array([[1, 0],
       [2, 1],
       [1, 1]])
>>>

Ясно, что результат не является интуитивным.

Ответ 1

Очевидно, что

e.shape == (3, 2, 2)

Сумма по оси - операция сокращения, поэтому указанная ось исчезает. Следовательно,

e.sum(axis=0).shape == (2, 2)
e.sum(axis=1).shape == (3, 2)
e.sum(axis=2).shape == (3, 2)

Ответ 2

Понимание того, что означает ось в numpy:

Рассмотрим трехмерную координатную плоскость x, y, z:

введите описание изображения здесь

Параметр оси - это число, которое связывается с массивами numpy, вдоль которых измеряется ваша агрегированная функция.

Python numpy/ pandas ось мнемоника:

axis=0 means 'along the row', (x in the above image)
axis=1 means 'along the column', (y in the above image)
axis=2 means 'along the depth', (z in the above image)

введите описание изображения здесь

Источник изображения: https://github.com/sentientmachine/Cheatsheets#python_numpy

Понимание параметра оси является необходимостью, если вы должны понимать квантование вектора, в частности, порядок мерных операций для трансляции.

Представьте, что мы хотим суммировать матрицу с тремя измерениями. Сумма могла бы действовать вдоль оси x, y или z или вдоль всех трех. По умолчанию ось равна 0, что означает самое внешнее измерение, самым внешним измерением является значение, возвращаемое your_3d_matrix[0]

Итак, если вы суммируете вдоль оси = 0, ось = 1 или ось = 2, вы получите одномерные кусочки суммы в этом измерении.

Пример:

a = np.array([[1,2],[3,4]])   #define a simple 2d ndarray

>>> a[0,0]
1
>>> a[0,1]
2
>>> a[1,0]
3
>>> a[1,1]
4


>>> a.sum()                   #axis not specified means first along the col then 
10                            #along the row: (1+3) = 4 and
                              #2+4 = 6 then along the column 4+6 = 10

>>> a.sum(axis=0)             #forcing axis=0 says collapse along the row so:
array([4, 6])                 #1+3 = 4,   2+4 = 6

>>> a.sum(axis=1)             #forcing axis=1 says collapse along the col so:
array([3, 7])                 #1+2 = 3,   3+4 = 7

Вы можете даже иметь ось = 2, которая является вторым измерением вниз:

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

       [[5, 6],
        [7, 8]]])
>>> b.sum()         #sum along depth, col, then row:
36
>>> b.sum(axis=0)   #sum across the topmost dimension 0, the two groups of 4
array([[ 6,  8],
       [10, 12]])
>>> b.sum(axis=1)   #sum across dimension 1 the lists of two, added.
array([[ 4,  6],
       [12, 14]])
>>> b.sum(axis=2)   #sum across the dimension 2, each individual list, row wise. 
array([[ 3,  7],
       [11, 15]])

Ориентация оси зависит от структуры, к которой она относится.

Порядок работы осевого коллапса начинается с внешнего значения, размер yourarray[0] до самого внутреннего: yourarray[0][0][0].

Даже разработчики, которые кодировали это программное обеспечение с числовым значением, не могут создать интуицию для линейной алгебры, управляющей матричными операциями, видео Youtube пытаются объяснить глубину оси:

Alexandre Chabot LeClerc NumPy Учебник, который охватывает параметр оси: https://youtu.be/gtejJ3RCddE?t=1h55m17s

Канал Data School на youtube имеет отличное объяснение параметра оси: https://youtu.be/PtO3t6ynH-8?t=5m1s

Ответ 3

Чтобы понять интуитивно axis, обратитесь к рисунку ниже (источник: Отдел физики, Корнелл Юни)

введите описание изображения здесь

Форма (булева) массива на рисунке выше shape=(8, 3). ndarray.shape вернет кортеж, где записи соответствуют длине конкретного измерения. В нашем примере 8 соответствует длине оси 0, тогда как 3 соответствует длине оси 1.