2025, Nov 17 12:03

Преобразование 3D массива NumPy в 2D и обратно: reshape и transpose

Пошагово показываем, как превратить 3D массив NumPy в 2D с тремя столбцами и без потерь восстановить исходную форму. Разбираем reshape и transpose, порядок осей.

Преобразовать трёхмерный массив NumPy в двухмерную таблицу, а затем вернуть его обратно кажется простым — пока не вмешивается порядок осей. Важно понимать, как взаимодействуют операции transpose и reshape, чтобы «туда‑обратно» сохраняло исходную структуру.

Кратко о задаче

Дан 3D‑массив формы (3, 2, 3). Нужно получить 2D‑массив с тремя столбцами, а затем восстановить исходное 3D‑представление.

import numpy as np
src = np.array([[[11, 12, 13], [14, 15, 16]],
                [[21, 22, 23], [24, 25, 26]],
                [[31, 32, 33], [34, 35, 36]]])
flat3 = src.transpose(1, 2, 0).reshape(-1, 3)
print('2D view with three columns:\n', flat3)

Что происходит на самом деле

Сначала выполняется перестановка осей через transpose(1, 2, 0), затем результат приводится к 2D‑матрице с тремя столбцами. Перестановка осей меняет логический порядок элементов между измерениями, поэтому при восстановлении нужно заново собрать 3D‑структуру и вернуть исходный порядок осей.

Решение

Один из способов получить тот же 2D‑вид с тремя столбцами — сделать reshape до (3, -1), а затем выполнить transpose. После этого вернуть исходный 3D‑массив можно, поменяв оси обратно и применив исходную форму.

import numpy as np
src = np.array([[[11, 12, 13], [14, 15, 16]],
                [[21, 22, 23], [24, 25, 26]],
                [[31, 32, 33], [34, 35, 36]]])
# 3D -> 2D с тремя столбцами
as_2d = src.reshape(3, -1).T
print('2D (three columns):\n', as_2d)
# 2D -> исходный 3D
back_3d = as_2d.T.reshape(src.shape)
print('Restored 3D:')
print(back_3d)

Если 2D‑массив был получен с помощью transpose(1, 2, 0).reshape(-1, 3), как показано выше, его можно восстановить, сначала приведя к совместимой 3D‑форме, а затем вернув порядок осей:

restored_alt = flat3.reshape(2, 3, 3).transpose(2, 0, 1)
print('Restored 3D (alternative):')
print(restored_alt)

Отдельный шаг flatten здесь не нужен: reshape сам выполняет необходимую переинтерпретацию данных перед применением новой формы.

Почему это важно

Операция reshape сама по себе не меняет порядок осей, а transpose — меняет. Сочетание их без чёткого плана приводит к перестановке данных, которую уже нельзя исправить одной лишь сменой формы. Нужно явно фиксировать перестановку осей и затем инвертировать её — это гарантирует корректное преобразование туда и обратно.

Выводы

Преобразуя 3D‑массив в 2D, определитесь: вы лишь «сплющиваете» измерения или ещё и переставляете оси. Если оси менялись местами, запомните точный порядок и восстановите его при реконструкции. Помните: в этом сценарии достаточно reshape, отдельный flatten не требуется.