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