Reshape: примеры (PYTHON)

Изменение формы массивов с помощью функции reshape в Python
Раздел: NumPy/Pandas, Форма массивов
reshape(newshape[, order]): ndarray

Основные сведения о функции reshape

Функция reshape в библиотеке NumPy предназначена для изменения формы массива без изменения его данных. Эта операция используется, когда требуется преобразовать структуру массива для дальнейших вычислений, совместимости с другими функциями или визуализации данных.

Функция принимает следующие параметры:

  • a - исходный массив для преобразования формы
  • newshape - целое число или кортеж целых чисел, определяющий новую форму массива
  • order - порядок чтения элементов: 'C' для строкового порядка (по умолчанию), 'F' для столбцового порядка, 'A' для сохранения порядка исходного массива

Функция возвращает новый массив с измененной формой, если это возможно, или поднимает исключение ValueError, если общее количество элементов не соответствует новой форме.

Базовые примеры применения

Пример изменения формы одномерного массива:

import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
result = arr.reshape(2, 3)
print(result)
[[1 2 3]
 [4 5 6]]

Пример с использованием параметра order:

arr = np.array([1, 2, 3, 4, 5, 6])
result = arr.reshape(2, 3, order='F')
print(result)
[[1 3 5]
 [2 4 6]]

Использование автоматического определения размерности:

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])
result = arr.reshape(2, -1)
print(result)
[[1 2 3 4]
 [5 6 7 8]]

Альтернативные функции в Python

В NumPy существуют несколько функций для изменения формы массивов:

  • resize - изменяет форму массива, при необходимости повторяя данные или обрезая их
  • ravel - возвращает одномерный массив без копирования данных, когда это возможно
  • flatten - всегда возвращает копию массива, сведенную к одному измерению
  • transpose - меняет оси массива местами

Функция reshape предпочтительна, когда необходимо точно контролировать форму без изменения данных. Функция resize подходит, когда допустимо изменение количества элементов. Ravel и flatten используются для преобразования в одномерный массив.

Аналоги в других языках программирования

В различных языках программирования существуют аналогичные операции:

JavaScript (библиотека math.js):

const math = require('mathjs');
const arr = [1, 2, 3, 4, 5, 6];
const result = math.reshape(arr, [2, 3]);
console.log(result);
[[1, 2, 3], [4, 5, 6]]

MATLAB/Octave:

A = [1, 2, 3, 4, 5, 6];
B = reshape(A, 2, 3);
B = 
   1   3   5
   2   4   6

R:

arr <- 1:6
dim(arr) <- c(2, 3)
print(arr)
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

Основное отличие NumPy reshape от аналогов в других языках - параметр order, контролирующий порядок заполнения массива.

Распространенные ошибки

Несоответствие количества элементов:

import numpy as np
arr = np.array([1, 2, 3, 4, 5])
try:
    result = arr.reshape(2, 3)
except ValueError as e:
    print(f"Ошибка: {e}")
Ошибка: cannot reshape array of size 5 into shape (2,3)

Использование отрицательных значений:

arr = np.array([1, 2, 3, 4, 5, 6])
try:
    result = arr.reshape(2, -2)
except ValueError as e:
    print(f"Ошибка: {e}")
Ошибка: can only specify one unknown dimension

Попытка изменить форму несуществующего массива:

arr = None
try:
    result = np.reshape(arr, (2, 3))
except AttributeError as e:
    print(f"Ошибка: {e}")
Ошибка: 'NoneType' object has no attribute 'reshape'

Изменения в последних версиях

В NumPy версии 1.18.0 была улучшена обработка подклассов массивов в функции reshape. С версии 1.20.0 появилась поддержка ключевого аргумента like для совместимости с другими библиотеками. Начиная с версии 1.22.0, улучшены сообщения об ошибках при несовместимых формах. В текущих версиях функция поддерживает все стандартные типы данных NumPy и лучше интегрирована с системой типов Python.

Расширенные примеры использования

Преобразование многомерного массива:

Пример python
import numpy as np
arr = np.arange(24).reshape(2, 3, 4)
print("Исходный массив:")
print(arr)
print("\nПосле reshape:")
result = arr.reshape(6, 4)
print(result)
Исходный массив:
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]

После reshape:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]]

Использование с Fortran-порядком для совместимости:

Пример python
arr = np.array([[1, 2, 3], [4, 5, 6]])
result = np.reshape(arr, (3, 2), order='F')
print(result)
[[1 5]
 [4 3]
 [2 6]]

Цепочка преобразований:

Пример python
arr = np.random.rand(12)
result = arr.reshape(3, 4).reshape(2, 6)
print("Форма результата:", result.shape)
print("Данные:")
print(result)
Форма результата: (2, 6)
Данные:
[[0.548 0.715 0.603 0.545 0.424 0.646]
 [0.438 0.892 0.964 0.383 0.792 0.529]]

Работа с комплексными числами:

Пример python
arr = np.array([1+2j, 3+4j, 5+6j, 7+8j])
result = arr.reshape(2, 2)
print(result)
[[1.+2.j 3.+4.j]
 [5.+6.j 7.+8.j]]

питон reshape function comments

En
Reshape Reshape array