NumPy - 数组重塑



重塑 NumPy 数组

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

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

将一维数组重塑为二维数组

我们可以使用 NumPy 中的 reshape() 函数将一维数组重塑为二维数组。这用于将线性数据组织成矩阵形式。

reshape() 函数改变现有数组的形状而不改变其数据。以下是语法:

numpy.reshape(array, newshape)

其中:

  • array − 你想要重塑的数组。

  • newshape − 你想要赋予数组的形状。它可以是整数或整数元组。一个维度可以是 -1,这意味着它将根据数组的长度和其余维度推断出来。

示例:基本的重塑

在下面的示例中,我们使用 reshape() 函数将具有 6 个元素的一维数组“arr”重塑为二维数组:

import numpy as np

# Original 1-D array
arr = np.array([1, 2, 3, 4, 5, 6])

# Reshape to 2-D array 
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
# Original 1-D array of test scores
scores = np.array([85, 90, 78, 92, 88, 76])

# Reshape into a 2-D array where each row is a student's scores
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]]

将一维数组重塑为三维数组

我们也可以使用 reshape() 函数将一维数组重塑为 NumPy 中的三维数组。这有助于你表示更复杂的结构数据,例如多通道图像(例如 RGB 图像)、不同通道的时间序列数据或体数据。

示例

在这个示例中,我们使用 reshape() 函数将具有 12 个元素的一维数组“arr”重塑为三维数组:

import numpy as np

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

# Reshape to 3-D array
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]]]

将 N 维数组重塑为一维数组

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

将复杂的多分量数组展平为一维格式简化了某些数据处理任务,并使数据更容易处理和分析。

示例

在下面的示例中,我们使用带有 -1 参数的 reshape() 函数将形状为 (2, 3) 的二维数组“arr”重塑为一维数组:

import numpy as np

# Original 2-D array
arr = np.array([[1, 2, 3], [4, 5, 6]])

# Reshape to 1-D array
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 个元素的一维数组 arr 重塑为三维数组,并将其中一个维度指定为“-1”:

import numpy as np

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

# Reshape to 3-D array with one unknown dimension
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 个元素的一维数组重塑为 3x3 矩阵 (reshape((3, 3))) 将引发此错误,因为 3 × 3 = 9 与 10 不同。

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

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

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

处理重塑数组时的错误

以下是处理 NumPy 中重塑数组时出现的错误的方法:

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

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

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

示例

在下面的示例中,我们尝试将具有 5 个元素的一维数组“arr”重塑为“2x3”二维数组,这将导致 ValueError,因为元素总数与指定的形状不匹配:

import numpy as np

# Original 1-D array
arr = np.array([1, 2, 3, 4, 5])

try:
   # Attempt to reshape to an incompatible shape
   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)
广告