NumPy 重塑函数

NumPyNumPyBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

NumPy 库中的 reshape() 函数允许你在不改变数组数据的情况下更改数组的形状。这个强大的函数能帮助你根据特定需求将数组元素重新组织成不同的维度。无论你是需要将一维数组转换为矩阵,还是为数据处理创建多维数组,reshape() 函数都能提供灵活的解决方案。

在这个实验中,我们将探索 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{{"NumPy 重塑函数"}} numpy/multi_array -.-> lab-86496{{"NumPy 重塑函数"}} numpy/shape_dim -.-> lab-86496{{"NumPy 重塑函数"}} numpy/reshape -.-> lab-86496{{"NumPy 重塑函数"}} end

NumPy 入门与数组创建

在我们对数组进行重塑操作之前,需要先了解什么是 NumPy 数组以及如何创建它们。NumPy(Numerical Python)是一个强大的库,它为大型多维数组和矩阵提供支持,同时还包含一系列用于操作这些数组的数学函数。

让我们先在 WebIDE 中创建一个新的 Python 文件。点击左侧侧边栏的“Explorer”图标,然后点击“New File”按钮。将文件命名为 numpy_reshape.py

New File

现在,让我们导入 NumPy 库并创建一个基本数组:

import numpy as np

## 使用 np.arange() 创建一个简单的一维数组,该函数会生成一个数字序列
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

## 创建一个简单的一维数组
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)  ## 分隔线

## 将数组重塑为一个 3 行 4 列的二维数组
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)  ## 分隔线

## 将数组重塑为一个 4 行 3 列的二维数组
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

## 创建一个简单的一维数组
original_array = np.arange(24)
print("Original 1D array:")
print(original_array)
print("Shape of the original array:", original_array.shape)
print("-" * 50)  ## 分隔线

## 重塑为一个维度为 2x3x4 的三维数组
## 这将创建 2 个块,每个块有 3 行 4 列
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)  ## 分隔线

## 访问三维数组中的元素
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)表示每行中的列数。

这种结构在图像处理(每个“块”可能是一个颜色通道)、时间序列数据(每个“块”可能是一个时间点)或其他需要多个矩阵的场景中特别有用。

理解重塑操作中的顺序参数

在重塑数组时,NumPy 提供了一个额外的参数 order,用于控制如何从原始数组中读取元素并将其放入重塑后的数组中。主要有两种排序约定:

  1. C 风格排序(行优先):这是 NumPy 中的默认排序方式,其中最后一个轴的索引变化最快。
  2. Fortran 风格排序(列优先):其中第一个轴的索引变化最快。

让我们通过在你的 numpy_reshape.py 文件中添加以下代码来探索这两种排序方法:

import numpy as np

## 创建一个一维数组
original_array = np.arange(12)
print("Original 1D array:")
print(original_array)
print("-" * 50)  ## 分隔线

## 使用 C 风格排序(默认)进行重塑
c_style = np.reshape(original_array, (3, 4), order='C')
print("Reshaped array with C-style ordering (row-major):")
print(c_style)
print("-" * 50)  ## 分隔线

## 使用 Fortran 风格排序进行重塑
f_style = np.reshape(original_array, (3, 4), order='F')
print("Reshaped array with Fortran-style ordering (column-major):")
print(f_style)
print("-" * 50)  ## 分隔线

## 使用数组的 reshape 方法的替代语法
array_method = original_array.reshape(3, 4)
print("Using the array's reshape method:")
print(array_method)
print("-" * 50)  ## 分隔线

## 使用 -1 作为维度(自动计算)
auto_dim = original_array.reshape(3, -1)  ## NumPy 将自动计算出 -1 应为 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. 数组方法语法:你可以使用 array.reshape(shape) 替代 np.reshape(array, shape)
  4. 自动维度计算:在某个维度上使用 -1 可以让 NumPy 根据数组的大小自动计算该维度。

order 参数在以下情况下尤为重要:

  • 当你处理非常大的数组,并且内存布局对性能有影响时。
  • 当你与使用不同默认排序方式的其他库或语言进行交互时。
  • 当你需要确保与特定算法兼容时。

总结

在本次实验中,我们探索了 NumPy 中功能多样的 reshape() 函数,该函数能让我们在不改变底层数据的情况下,将数组数据重新组织成不同的维度。以下是我们学到的内容:

  1. 基础重塑操作:如何将一维数组转换为具有不同行和列配置的二维矩阵。
  2. 高级重塑操作:创建用于更复杂数据结构的三维数组,这些数组可用于表示体积、图像的时间序列或其他多维数据。
  3. 顺序参数:理解 C 风格(行优先)和 Fortran 风格(列优先)排序之间的差异,以及它们如何影响重塑数组中元素的排列方式。
  4. 替代语法:使用 np.reshape() 函数和数组的 .reshape() 方法来实现相同的结果。
  5. 自动维度计算:使用 -1 作为占位符,让 NumPy 自动计算合适的维度。

reshape() 函数是使用 NumPy 进行数据处理的基础工具,它能为数据科学、机器学习和科学计算等各种应用高效地重新组织数据。正确理解如何重塑数据对于为模型准备输入、可视化多维数据以及对数组执行复杂的数学运算至关重要。