Вопрос или проблема
У меня возникли трудности с пониманием .moveaxis
в Numpy.
Сначала я создаю массив, используя a=np.arange(24).reshape(2,3,4)
. Система сначала заполнит ось 2 значениями 0 1 2 3
, затем перейдет к следующей строке по оси 1. Когда первая ‘страница’ будет закончена, система перейдет по оси 0. Получается следующее.
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]]])
Если я введу b = np.swapaxes(a,0,2); b
, система сначала заполнит ось 0, потом ось 1 и, наконец, ось 2. Получается следующее.
array([[[ 0, 12],
[ 4, 16],
[ 8, 20]],
[[ 1, 13],
[ 5, 17],
[ 9, 21]],
[[ 2, 14],
[ 6, 18],
[10, 22]],
[[ 3, 15],
[ 7, 19],
[11, 23]]])
Это понятно, так как ось 1 сохраняется, поэтому мы можем по-прежнему видеть столбцы, такие как 0 4 8
и 1 5 9
после обмена осями.
Но я действительно не понимаю, как работает .moveaxis
. Если я введу b = np.moveaxis(a,0,2); b
, получается следующее.
array([[[ 0, 12],
[ 1, 13],
[ 2, 14],
[ 3, 15]],
[[ 4, 16],
[ 5, 17],
[ 6, 18],
[ 7, 19]],
[[ 8, 20],
[ 9, 21],
[10, 22],
[11, 23]]])
Я знаю, что функция .moveaxis
предназначена для ‘перемещения оси 0 на новую позицию, в то время как другие оси остаются в том же порядке’, но что это значит? Я понимаю, что результат должен быть массивом с формой (3, 4, 2)
, но почему система сначала переходит вниз по первому столбцу, а затем переходит ко второй странице?
Вы просили помощи в понимании механизма, стоящего за .moveaxis
. Документация объясняет это дважды, неточно на английском и очень точно в коде, когда вы нажимаете на [source]
. Там не так много происходит. Мы просто выбираем новый порядок существующих осей, указанный вызывающим.
order = [n for n in range(a.ndim) if n not in source]
for dest, src in sorted(zip(destination, source)):
order.insert(dest, src)
А затем окончательное присвоение по сути вычисляет np.transpose(order)
, так что это метод, который вы хотите изучить, чтобы лучше понять эту функцию.
Помните, что .rollaxis() устаревает, а .moveaxis() предлагает супerset его функциональности. Изучение подмножества может оказаться полезным для вас.
Ответ или решение
Чтобы понять работу функции .moveaxis
в NumPy, важно прежде всего осознать, как организованы многомерные массивы и как механизм перемещения осей влияет на их структуру. Посмотрим на это более подробно.
Что такое .moveaxis
в NumPy?
Функция .moveaxis
предназначена для перемещения выбранных осей массива NumPy в новую позицию, при этом остальные оси сохраняют свой порядок. Это дает возможность легко изменять представление данных в массиве без необходимости вручную перестраивать его.
Пример создания массива
Начнем с создания массива:
import numpy as np
a = np.arange(24).reshape(2, 3, 4)
В результате мы получаем массив a
размера (2, 3, 4):
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]]])
Понимание работы .swapaxes
Когда вы используете np.swapaxes(a, 0, 2)
, вы меняете местами оси 0 и 2. Таким образом, новая структура массива становится следующей (размер (4, 3, 2)):
array([[[ 0, 12],
[ 4, 16],
[ 8, 20]],
[[ 1, 13],
[ 5, 17],
[ 9, 21]],
[[ 2, 14],
[ 6, 18],
[10, 22]],
[[ 3, 15],
[ 7, 19],
[11, 23]]])
Как работает .moveaxis
Теперь, если вы вызываете np.moveaxis(a, 0, 2)
, это означает, что вы хотите переместить ось 0 на позицию 2. Остальные оси сохранят свой порядок. С точки зрения индексов, массив после перемещения оси будет иметь размер (3, 4, 2):
b = np.moveaxis(a, 0, 2)
И вы получаете следующий результат:
array([[[ 0, 12],
[ 1, 13],
[ 2, 14],
[ 3, 15]],
[[ 4, 16],
[ 5, 17],
[ 6, 18],
[ 7, 19]],
[[ 8, 20],
[ 9, 21],
[10, 22],
[11, 23]]])
Почему так происходит?
В результате перемещения оси 0 на позицию 2, элементы, расположенные в первой оси (размер 2), теперь становятся последними в новой форме. Сначала будет формироваться первая "страница", содержащая все элементы из первой оси, затем — элементы второй оси. Таким образом происходит распределение по колонкам.
- Текущая структура {(0, 0), (0, 1), (0, 2)}, где каждое значение соответствует элементу в первой оси, становится {(1, 0), (1, 1), (1, 2)}, после чего добавляются значения из второй оси.
Заключение
Функция .moveaxis
— это мощный инструмент для изменения представления многомерных данных в NumPy. Понимание того, как работает этот механизм, помогает эффективно управлять данными, что особенно полезно в области научных вычислений и обработки данных.
Если у вас есть дополнительные вопросы о том, как использовать NumPy или о манипуляциях с массивами, не стесняйтесь задавать их!