Проблемы с пониманием .moveaxis в Numpy

Вопрос или проблема

У меня возникли трудности с пониманием .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 или о манипуляциях с массивами, не стесняйтесь задавать их!

Оцените материал
Добавить комментарий

Капча загружается...