NumPy - 数组重塑
NumPy 数组重塑
重塑 NumPy 数组是指改变其形状,即在元素总数保持不变的情况下修改每个维度上的元素数量。换句话说,新形状中维度的乘积必须等于原始形状中维度的乘积。
例如,形状为 (6,) 的数组可以重塑为 (2, 3) 或 (3, 2),但不能重塑为 (2, 2),因为 2x2 数组无法容纳 6 个元素。
将一维数组重塑为二维数组
我们可以使用 NumPy 中的 reshape() 函数将一维数组重塑为二维数组。这用于将线性数据组织成矩阵形式。
reshape() 函数用于在不改变数据的情况下改变现有数组的形状。语法如下:
numpy.reshape(array, newshape)
其中:
array - 需要重塑的数组。
newshape - 需要赋予数组的形状。它可以是整数或整数元组。其中一个维度可以为 -1,这意味着它将根据数组的长度和其余维度进行推断。
示例:基本重塑
在以下示例中,我们使用 reshape() 函数将包含 6 个元素的一维数组 "arr" 重塑为二维数组 -
import numpy as np # 原始一维数组 arr = np.array([1, 2, 3, 4, 5, 6]) # 重塑为二维数组 reshaped_arr = arr.reshape((2, 3)) print("一维数组转二维数组 (2x3):") print(reshaped_arr)
以下是获得的输出−
一维数组转二维数组 (2x3): [[1 2 3] [4 5 6]]
示例:重塑的实际用例
假设您有一个班级学生的考试成绩列表,您想将它们组织成一个表格,其中每一行代表一个学生,每一列代表不同的考试。您可以通过将一维分数数组重塑为二维数组来实现 -
import numpy as np # 原始一维考试成绩数组 scores = np.array([85, 90, 78, 92, 88, 76]) # 重塑为二维数组,每行代表一位学生的分数 scores_matrix = scores.reshape((2, 3)) print("分数矩阵 (2 名学生,每人 3 次考试):") print(scores_matrix)
这将产生以下结果 -
分数矩阵 (2 名学生,每人 3 次考试): [[85 90 78] [92 88 76]]
将一维数组重塑为三维数组
我们还可以在 NumPy 中使用 reshape() 函数将一维数组重塑为三维数组。这有助于您表示具有更复杂结构的数据,例如多通道图像(例如 RGB 图像)、跨不同通道的时间序列数据或体积数据。
示例
在此示例中,我们使用 reshape() 函数将包含"12"个元素的一维数组 "arr" 重塑为三维数组 -
import numpy as np # 原始一维数组 arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) # 重塑为三维数组 reshaped_arr = arr.reshape((2, 2, 3)) print("一维数组转三维数组(2x2x3):") print(reshaped_arr)
以下是上述代码的输出 -
一维数组转三维数组 (2x2x3): [[[ 1 2 3] [ 4 5 6]] [[ 7 8 9] [10 11 12]]]
将 N 维数组重塑为 1 维数组
在 NumPy 中,将 N 维 (N-D) 数组重塑为 1 维 (1-D) 数组是将多维数组展平或折叠为单个线性数组的过程。我们也可以使用 reshape() 函数来实现这一点。
将复杂的多维数组展平为一维格式可以简化某些数据处理任务,并使数据更易于处理和分析。
示例
在下面的示例中,我们使用 reshape() 函数(参数为 -1)将形状为 (2, 3) 的二维数组 "arr" 重塑为一维数组 -
import numpy as np # 原始二维数组 arr = np.array([[1, 2, 3], [4, 5, 6]]) # 重塑为一维数组 reshaped_arr = arr.reshape(-1) print("重塑数组:", reshaped_arr)
得到的输出如下所示−
重塑数组:[1 2 3 4 5 6]
重塑未知维度数组
您可以使用 NumPy 中的 reshape() 函数重塑具有未知维度的数组。通过将 -1 作为参数传递给 reshape() 函数,NumPy 会根据数组中元素的总数和其他指定的维度自动计算该维度的大小。
这有助于您重塑数组,而无需明确计算每个维度的确切大小。
示例
在以下示例中,我们使用 reshape() 函数将一个包含"12"个元素的一维数组 arr 重塑为一个"三维"数组,并将其中一个维度指定为"-1" -
import numpy as np # 原始一维数组 arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) # 重塑为具有一个未知维度的三维数组 reshaped_arr = arr.reshape((2, 2, -1)) print("重塑后的数组,维度未知:") print(reshaped_arr)
执行上述代码后,我们得到以下输出 -
重塑后的数组,维度未知: [[[ 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 # 原始一维数组 arr = np.array([1, 2, 3, 4, 5]) try: # 尝试重塑为不兼容的形状 reshaped_arr = arr.reshape((2, 3)) except ValueError as e: print("重塑过程中发生错误:") print(e)
得到的错误如下 -
重塑过程中发生错误: cannot reshape array of size 5 into shape (2,3)