Понимание оси в Python

Я видел пару кодов, используя numpy.apply_along_axis и я всегда должны проверить коды, чтобы увидеть, как это работает, потому что я не понимаю axis идея в Python еще.

например, я проверял этой простые коды из ссылки.

Я вижу, что для первого случая был взят первый столбец каждой строки матрицы, а во втором случае рассматривалась сама строка.

поэтому я создаю пример, чтобы проверить, как это работает с массив матриц (проблема, которая привела меня к этому вопросу оси), который также можно рассматривать как 3d-матрицу, где каждая строка является матрицей, верно?

a = [[[1,2,3],[2,3,4]],[[4,5,6],[9,8,7]]]

import numpy
data = numpy.array([b for b in a])

def my_func(x):
    return (x[0] + x[-1]) * 0.5

b = numpy.apply_along_axis(my_func, 0, data)
b = numpy.apply_along_axis(my_func, 1, data)

который дал мне:

array([[ 2.5,  3.5,  4.5],
       [ 5.5,  5.5,  5.5]])

и:

array([[ 1.5,  2.5,  3.5],
       [ 6.5,  6.5,  6.5]])

для первого результата я получил то, что я ожидал. Но за второй, я думал, что получу:

array([[ 2.,  3.],
       [ 5.,  8.]])

тогда я подумал, что, возможно, это должно быть axis=2 и я получил предыдущий результат тестирования. Итак, мне интересно, как это работает это правильно.

спасибо.

3 ответов


во-первых,data=numpy.array(a) уже достаточно, нет необходимости использовать numpy.array([b for b in a]).

data Теперь 3D ndarray в форме (2,2,3), и имеет 3 оси 0, 1, 2. Первая ось имеет длину 2, длина второй оси также 2 и длина третьей оси 3.

и numpy.apply_along_axis(my_func, 0, data) и numpy.apply_along_axis(my_func, 1, data) приведет к 2D массиву shape (2,3). В обоих случаях форма (2,3) те из оставшихся осей, 2-й и 3-й или 1-й и 3-й.

numpy.apply_along_axis(my_func, 2, data) возвращает (2,2) массив формы вы показали, где (2,2) форма первых 2 осей, как вы apply вдоль 3-й оси (путем указания индекса 2).

способ понять это-какая бы ось вы ни применяли вдоль, будет "свернута" в форму вашего my_func, который в данном случае возвращает одно значение. Порядок и форма остальной оси останутся неизменными.

альтернативный способ думать об этом: apply_along_axis означает применить эту функцию к значениям на этой оси для каждой комбинации оставшихся осей / осей. Извлеките результат и организуйте их обратно в форму оставшихся осей/осей. Итак, если my_func возвращает tuple из 4 значений:

def my_func(x):
    return (x[0] + x[-1]) * 2,1,1,1

мы ожидаем numpy.apply_along_axis(my_func, 0, data).shape на (4,2,3).

  • см. также numpy.apply_over_axes для многократного применения функции по нескольким осям

пусть будет array of shape (2,2,3). Видно, что axis 0, axis 1, axis 2 есть 2 ,2, 3 значения данных соответственно.

это индексы элементов массива

[
    [
        [(0,0,0) (0,0,1), (0,0,2)],
        [(0,1,0) (0,1,1), (0,1,2)]
    ],
    [
        [(1,0,0) (1,0,1), (1,0,2)],
        [(1,1,0) (1,1,1), (1,1,2)]
    ]
]

теперь если вы применяете некоторую операцию вдоль некоторой оси, то измените индексы вдоль этой оси, только сохраняя индексы вдоль двух других осей постоянными.

Пример: если мы применяем некоторую операцию F вдоль axis 0, то элементы результат будет

[
    [F((0,0,0),(1,0,0)), F((0,0,1),(1,0,1)), F((0,0,2),(1,0,2))],
    [F((0,1,0),(1,1,0)), F((0,1,1),(1,1,1)), F((0,1,2),(1,1,2))]
]

вдоль axis 1:

[
    [F((0,0,0),(0,1,0)), F((0,0,1),(0,1,1)), F((0,0,2),(0,1,2))],
    [F((0,1,0),(1,1,0)), F((0,1,1),(1,1,1)), F((0,1,2),(1,1,2))]
]

вдоль axis 2:

[
    [F((0,0,0),(0,0,1),(0,0,2)), F((0,1,0),(0,1,1),(0,1,2))],
    [F((1,0,0),(1,0,1),(1,0,2)), F((1,1,0),(1,1,1),(1,1,2))]
]

также форму результирующего массива можно вывести, опустив заданную ось в форме заданных данных.


возможно, проверка формы вашего массива поможет уточнить, какая Ось какая;

print data.shape

>> (2,2,3)

Это означает, что вызов

numpy.apply_along_axis(my_func, 2, data)

действительно должен дать матрицу 2x2, а именно

array([[ 2.,  3.],
      [ 5.,  8.]])

- за 3-я ось (индекс 2) имеет длину 3, в то время как остальные оси имеют длину 2.