Функция reshape в NumPy

NumPyNumPyBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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

В этом практическом занятии (LabEx) мы рассмотрим практические применения функции reshape(), изучим ее синтаксис и научимся эффективно использовать ее с различными параметрами.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL numpy(("NumPy")) -.-> numpy/ArrayBasicsGroup(["Array Basics"]) numpy(("NumPy")) -.-> numpy/ArrayManipulationGroup(["Array Manipulation"]) numpy/ArrayBasicsGroup -.-> numpy/1d_array("1D Array Creation") numpy/ArrayBasicsGroup -.-> numpy/multi_array("Multi-dimensional Array Creation") numpy/ArrayBasicsGroup -.-> numpy/shape_dim("Shapes and Dimensions") numpy/ArrayManipulationGroup -.-> numpy/reshape("Reshape") subgraph Lab Skills numpy/1d_array -.-> lab-86496{{"Функция reshape в NumPy"}} numpy/multi_array -.-> lab-86496{{"Функция reshape в NumPy"}} numpy/shape_dim -.-> lab-86496{{"Функция reshape в NumPy"}} numpy/reshape -.-> lab-86496{{"Функция reshape в NumPy"}} end

Начало работы с NumPy и создание массивов

Перед тем, как мы сможем изменить форму массивов, нам нужно понять, что такое массивы NumPy и как их создавать. NumPy (Numerical Python) - это мощная библиотека, которая обеспечивает поддержку больших многомерных массивов и матриц, а также набор математических функций для работы с этими массивами.

Начнем с создания нового Python-файла в WebIDE. Нажмите на иконку "Explorer" в левой боковой панели, а затем на кнопку "New File". Назовите ваш файл numpy_reshape.py.

New File

Теперь импортируем библиотеку NumPy и создадим простой массив:

import numpy as np

## Create a simple 1D array using np.arange() which generates a sequence of numbers
original_array = np.arange(12)
print("Original 1D array:")
print(original_array)
print("Shape of the original array:", original_array.shape)
print("Dimensions of the original array:", original_array.ndim)

Откройте терминал в WebIDE и запустите ваш скрипт:

python3 numpy_reshape.py

Вы должны увидеть вывод, похожий на следующий:

Original 1D array:
[ 0  1  2  3  4  5  6  7  8  9 10 11]
Shape of the original array: (12,)
Dimensions of the original array: 1

Понять, что здесь происходит:

  • np.arange(12) создает одномерный массив со значениями от 0 до 11
  • array.shape показывает размерность массива (12 элементов в одной размерности)
  • array.ndim показывает количество размерностей (в данном случае 1)

Базовое изменение формы - преобразование одномерных массивов в двумерные

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

Откройте файл numpy_reshape.py и добавьте следующий код:

import numpy as np

## Create a simple 1D array
original_array = np.arange(12)
print("Original 1D array:")
print(original_array)
print("Shape of the original array:", original_array.shape)
print("Dimensions of the original array:", original_array.ndim)
print("-" * 50)  ## Separator line

## Reshape the array to a 2D array with 3 rows and 4 columns
reshaped_3x4 = np.reshape(original_array, (3, 4))
print("Reshaped array (3x4):")
print(reshaped_3x4)
print("Shape of the reshaped array:", reshaped_3x4.shape)
print("Dimensions of the reshaped array:", reshaped_3x4.ndim)
print("-" * 50)  ## Separator line

## Reshape the array to a 2D array with 4 rows and 3 columns
reshaped_4x3 = np.reshape(original_array, (4, 3))
print("Reshaped array (4x3):")
print(reshaped_4x3)
print("Shape of the reshaped array:", reshaped_4x3.shape)
print("Dimensions of the reshaped array:", reshaped_4x3.ndim)

Запустите скрипт в терминале:

python3 numpy_reshape.py

Вы должны увидеть вывод, показывающий, как исходный массив был преобразован в различные двумерные структуры.

Понять, что здесь происходит:

  1. Сначала мы создали одномерный массив из 12 элементов.
  2. Затем мы преобразовали его в матрицу 3×4 (3 строки, 4 столбца).
  3. После этого мы преобразовали его в матрицу 4×3 (4 строки, 3 столбца).

В обоих случаях общее количество элементов остается тем же (12), но их организация меняется. Функция reshape() требует, чтобы новая форма была совместима с размером исходного массива. Это означает, что произведение размерностей в новой форме должно быть равно общему количеству элементов в исходном массиве.

Продвинутое изменение формы - создание трехмерных массивов

Теперь перейдем к более продвинутому изменению формы путем создания трехмерных массивов. Трехмерные массивы по сути представляют собой массивы двумерных массивов и полезны для представления объемов, временных рядов изображений или других сложных структур данных.

Добавьте следующий код в файл numpy_reshape.py:

import numpy as np

## Create a simple 1D array
original_array = np.arange(24)
print("Original 1D array:")
print(original_array)
print("Shape of the original array:", original_array.shape)
print("-" * 50)  ## Separator line

## Reshape into a 3D array with dimensions 2x3x4
## This creates 2 blocks, each with 3 rows and 4 columns
reshaped_3d = np.reshape(original_array, (2, 3, 4))
print("Reshaped 3D array (2x3x4):")
print(reshaped_3d)
print("Shape of the 3D array:", reshaped_3d.shape)
print("Dimensions of the 3D array:", reshaped_3d.ndim)
print("-" * 50)  ## Separator line

## Accessing elements in a 3D array
print("First block of the 3D array:")
print(reshaped_3d[0])
print("\nSecond block of the 3D array:")
print(reshaped_3d[1])
print("\nElement at position [1,2,3] (second block, third row, fourth column):")
print(reshaped_3d[1, 2, 3])

Запустите скрипт еще раз:

python3 numpy_reshape.py

Вывод показывает, как одномерный массив из 24 элементов можно преобразовать в трехмерную структуру. Эта структура можно представить как 2 блока, каждый из которых содержит матрицу 3×4.

Понимание трехмерных массивов:

  • Первое измерение (2) представляет количество "блоков" или "слоев".
  • Второе измерение (3) представляет количество строк в каждом блоке.
  • Третье измерение (4) представляет количество столбцов в каждой строке.

Эта структура особенно полезна для обработки изображений (где каждый "блок" может быть цветовым каналом), временных рядов данных (где каждый "блок" может быть временной точкой) или других сценариев, требующих нескольких матриц.

Понимание параметров порядка в функции reshape

При изменении формы массивов NumPy предоставляет дополнительный параметр order, который контролирует, как элементы считываются из исходного массива и помещаются в массив с измененной формой. Существует два основных соглашения о порядке:

  1. Порядок, аналогичный C (строковый порядок, row-major): По умолчанию в NumPy, где индекс последней оси изменяется быстрее всего.
  2. Порядок, аналогичный Fortran (столбцовый порядок, column-major): Где индекс первой оси изменяется быстрее всего.

Давайте рассмотрим оба метода порядка, добавив следующий код в файл numpy_reshape.py:

import numpy as np

## Create a 1D array
original_array = np.arange(12)
print("Original 1D array:")
print(original_array)
print("-" * 50)  ## Separator line

## Reshape using C-style ordering (default)
c_style = np.reshape(original_array, (3, 4), order='C')
print("Reshaped array with C-style ordering (row-major):")
print(c_style)
print("-" * 50)  ## Separator line

## Reshape using Fortran-style ordering
f_style = np.reshape(original_array, (3, 4), order='F')
print("Reshaped array with Fortran-style ordering (column-major):")
print(f_style)
print("-" * 50)  ## Separator line

## Alternative syntax using the array's reshape method
array_method = original_array.reshape(3, 4)
print("Using the array's reshape method:")
print(array_method)
print("-" * 50)  ## Separator line

## Using -1 as a dimension (automatic calculation)
auto_dim = original_array.reshape(3, -1)  ## NumPy will figure out that -1 should be 4
print("Using automatic dimension calculation with -1:")
print(auto_dim)
print("Shape:", auto_dim.shape)

Запустите скрипт, чтобы увидеть различия:

python3 numpy_reshape.py

Основные моменты для понимания:

  1. Порядок, аналогичный C (строковый порядок): Элементы помещаются строка за строкой. Это значение по умолчанию в NumPy.
  2. Порядок, аналогичный Fortran (столбцовый порядок): Элементы помещаются столбец за столбцом.
  3. Синтаксис метода массива: Вместо использования np.reshape(array, shape) можно использовать array.reshape(shape).
  4. Автоматический расчет размерности: Использование -1 для одной из размерностей сообщает NumPy автоматически рассчитать эту размерность на основе размера массива.

Параметр порядка особенно важен, когда:

  • Вы работаете с очень большими массивами, и для производительности важна организация памяти.
  • Вы взаимодействуете с другими библиотеками или языками, которые используют другое значение по умолчанию для порядка.
  • Вам необходимо обеспечить совместимость с определенными алгоритмами.

Резюме

В этом практическом занятии мы изучили универсальную функцию reshape() в NumPy, которая позволяет переупорядочивать данные массива в разные размерности без изменения исходных данных. Вот то, что мы узнали:

  1. Базовое изменение формы: Как преобразовать одномерные массивы в двумерные матрицы с разными конфигурациями строк и столбцов.

  2. Продвинутое изменение формы: Создание трехмерных массивов для более сложных структур данных, которые полезны для представления объемов, временных рядов изображений или других многомерных данных.

  3. Параметры порядка: Понимание различий между порядком, аналогичным C (строковый порядок, row-major) и порядком, аналогичным Fortran (столбцовый порядок, column-major), и как они влияют на то, как элементы располагаются в массиве с измененной формой.

  4. Альтернативный синтаксис: Использование как функции np.reshape(), так и метода .reshape() массива для достижения одинаковых результатов.

  5. Автоматический расчет размерности: Использование -1 в качестве заполнителя, чтобы NumPy автоматически рассчитал подходящую размерность.

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