Понимание оси в 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.