Reshape: примеры (PYTHON)
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.
Расширенные примеры использования
Преобразование многомерного массива:
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-порядком для совместимости:
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]]
Цепочка преобразований:
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]]
Работа с комплексными числами:
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]]