NumPy 数组怎么重塑形状?reshape 操作详解

文章导读
Previous Quiz Next 重塑 NumPy 数组 重塑 NumPy 数组是指改变其形状,即修改每个维度上的元素数量,同时保持总元素数量不变。换句话说,新形状中各维度的乘积必须等于原始形状中各维度的乘积。
📋 目录
  1. 重塑 NumPy 数组
  2. 将 1D 数组重塑为 2D 数组
  3. 将 1D 数组重塑为 3D 数组
  4. 将 ND 数组重塑为 1D 数组
  5. 重塑未知维度数组
  6. 重塑数组时发生的错误
A A

NumPy - 重塑数组



Previous
Quiz
Next

重塑 NumPy 数组

重塑 NumPy 数组是指改变其形状,即修改每个维度上的元素数量,同时保持总元素数量不变。换句话说,新形状中各维度的乘积必须等于原始形状中各维度的乘积。

例如,形状为 (6,) 的数组可以重塑为 (2, 3) 或 (3, 2),但不能重塑为 (2, 2),因为 6 个元素无法放入 2x2 数组中。

将 1D 数组重塑为 2D 数组

我们可以使用 reshape() function 在 NumPy 中将 1-D 数组重塑为 2-D 数组。这用于将线性数据组织成矩阵形式。

reshape() function 会改变现有数组的形状,而不改变其数据。语法如下 −

numpy.reshape(array, newshape)

其中,

  • array − 要重塑的数组。

  • newshape − 要赋予数组的新形状。可以是整数或整数元组。其中一个维度可以是 -1,表示将根据数组长度和剩余维度推断该维度。

示例:基本重塑

在以下示例中,我们将包含 “6” 个元素的 1D 数组 "arr" 使用 reshape() function 重塑为 2D 数组 −

import numpy as np

# 原始 1-D 数组
arr = np.array([1, 2, 3, 4, 5, 6])

# 重塑为 2-D 数组 
reshaped_arr = arr.reshape((2, 3))
print("1-D to 2-D Array (2x3):")
print(reshaped_arr)

输出如下 −

1-D to 2-D Array (2x3):
[[1 2 3]
 [4 5 6]]

示例:重塑的实际用例

假设你有一个班级学生的测试分数列表,你想将它们组织成表格,其中每行代表一个学生,每列代表不同的测试。你可以通过将分数的一维数组重塑为二维数组来实现 −

import numpy as np
# 原始 1-D 测试分数数组
scores = np.array([85, 90, 78, 92, 88, 76])

# 重塑为 2-D 数组,每行是一个学生的分数
scores_matrix = scores.reshape((2, 3))
print("Scores Matrix (2 students, 3 tests each):")
print(scores_matrix)

结果如下 −

Scores Matrix (2 students, 3 tests each):
[[85 90 78]
 [92 88 76]]

将 1D 数组重塑为 3D 数组

我们也可以使用 reshape() function 在 NumPy 中将 1-D 数组重塑为 3-D 数组。这有助于表示更复杂结构的数据,例如多通道图像(例如 RGB 图像)、跨不同通道的时间序列数据或体素数据。

示例

在本示例中,我们将包含 “12” 个元素的 1-D 数组 "arr" 使用 reshape() function 重塑为 3-D 数组 −

import numpy as np

# 原始 1-D 数组
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])

# 重塑为 3-D 数组
reshaped_arr = arr.reshape((2, 2, 3))
print("1-D to 3-D Array (2x2x3):")
print(reshaped_arr)

以上代码的输出如下 −

1-D to 3-D Array (2x2x3):
[[[ 1  2  3]
  [ 4  5  6]]

 [[ 7  8  9]
  [10 11 12]]]

将 ND 数组重塑为 1D 数组

在 NumPy 中将 N 维 (N-D) 数组重塑为 1 维 (1-D) 数组的过程是将多维数组展平或折叠成单个线性数组。我们也可以使用 reshape() function 来实现。

将复杂多维数组展平为 1-D 格式可以简化某些数据处理任务,并使数据更容易处理和分析。

示例

在下面的示例中,我们将形状为 (2, 3) 的 2-D 数组 "arr" 使用 reshape() function 并以 -1 作为参数重塑为 1-D 数组 −

import numpy as np

# 原始 2-D 数组
arr = np.array([[1, 2, 3], [4, 5, 6]])

# 重塑为 1-D 数组
reshaped_arr = arr.reshape(-1)
print("Reshaped Array:", reshaped_arr)

获得的输出如下所示 −

Reshaped Array:[1 2 3 4 5 6]

重塑未知维度数组

你可以使用 NumPy 中的 reshape() 函数来重塑具有未知维度的数组。通过将 -1 作为参数传递给 reshape() 函数,NumPy 会根据数组中的元素总数和其他指定的维度自动计算该维度的大小。

这有助于你在不明确计算每个维度确切大小时重塑数组。

示例

在以下示例中,我们使用 reshape() 函数将具有 "12" 个元素的 1-D 数组 arr 重塑为 "3-D" 数组,并将其中一个维度指定为 "-1" −

import numpy as np

# 原始 1-D 数组
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])

# 重塑为具有一个未知维度的 3-D 数组
reshaped_arr = arr.reshape((2, 2, -1))
print("Reshaped Array with Unknown Dimension:")
print(reshaped_arr)

执行上述代码后,我们得到以下输出 −

Reshaped Array with Unknown Dimension:
[[[ 1  2  3]
  [ 4  5  6]][[ 7  8  9]
  [10 11 12]]]

重塑数组时发生的错误

在 NumPy 中重塑数组有时会导致错误,特别是当元素总数与指定维度的乘积不匹配时。确保新形状与数组中的元素数量兼容非常重要。

重塑数组时的常见错误

以下是在 NumPy 中重塑数组时最常见的错误 −

  • ValueError: 新数组的总大小必须保持不变 − 当原始数组中的元素数量与重塑指定的维度乘积不匹配时,会发生此错误。

    例如,尝试将具有 10 个元素的 1-D 数组重塑为 3x3 矩阵(reshape((3, 3)))会引发此错误,因为 3 × 3 = 9 与 10 不同。

  • ValueError: 无法将大小为 X 的数组重塑为形状 (Y, Z) − 此错误表示原始数组大小 (X) 与指定的形状 (Y, Z) 不兼容。

    例如,尝试将大小为 10 的 1-D 数组重塑为 2x5 矩阵(reshape((2, 5)))会引发此错误,因为 2 × 5 = 10,但数组需要是 2 维的才能适应新形状。

  • TypeError: 'numpy.ndarray' 对象无法被解释为整数 − 当为重塑提供的维度不是整数或指定不正确时,会发生此错误。确保传递给 reshape() 函数的所有维度都是有效的整数,并且它们正确表示新形状。

处理重塑数组时的错误

以下是在 NumPy 中重塑数组时处理错误的方法 −

  • 检查数组大小 在重塑之前,使用 array.size() 函数验证原始数组的大小,并确保它与新形状维度的乘积匹配。

  • 对未知维度使用 -1 在重塑时,如果一个维度未知,使用 -1 让 NumPy 根据数组中的元素总数自动计算它。

  • 捕获异常 将你的重塑代码包装在 try-except 块中,以捕获潜在错误并优雅地处理它们。这可以防止程序崩溃,并允许适当的错误消息或回退操作。

示例

在以下示例中,我们尝试将具有 5 个元素的 1D 数组 "arr" 重塑为 "2x3" 2D 数组,这会导致 ValueError,因为元素总数与指定的形状不匹配 −

import numpy as np

# 原始 1-D 数组
arr = np.array([1, 2, 3, 4, 5])

try:
   # 尝试重塑为不兼容的形状
   reshaped_arr = arr.reshape((2, 3))
except ValueError as e:
   print("Error Occurred During Reshaping:")
   print(e)

得到的错误如下 −

Error Occurred During Reshaping:
cannot reshape array of size 5 into shape (2,3)