NumPy - 重塑数组
重塑 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)