8.1 数组的重塑 (Reshaping) NumPy 数组的重塑 (Reshaping) NumPy 数组的重塑 (Reshaping) 是 NumPy 中一项非常重要的操作,它允许我们在不改变数组数据的情况下,改变数组的维度和形状。这在数据处理、机器学习和科学计算中非常有用,因为不同的算法和模型可能需要不同形状的数据输入。 8.1 数组重塑的核心概念 重塑的核心思想是改变数组的维度,例如将一维数组变成二维数组,或者将二维数组变成三维数组。 关键在于,重塑操作不会改变数组中的数据,只是改变了数据的组织方式。 为了成功地重塑数组,新的形状必须与原始数组中的元素总数兼容。 也就是说,新形状的维度大小的乘积必须等于原始数组的元素总数。 8.1.
NumPy 数组的重塑 (Reshaping) 是 NumPy 中一项非常重要的操作,它允许我们在不改变数组数据的情况下,改变数组的维度和形状。这在数据处理、机器学习和科学计算中非常有用,因为不同的算法和模型可能需要不同形状的数据输入。
重塑的核心思想是改变数组的维度,例如将一维数组变成二维数组,或者将二维数组变成三维数组。 关键在于,重塑操作不会改变数组中的数据,只是改变了数据的组织方式。 为了成功地重塑数组,新的形状必须与原始数组中的元素总数兼容。 也就是说,新形状的维度大小的乘积必须等于原始数组的元素总数。
reshape() 方法reshape() 方法是 NumPy 中用于重塑数组的主要工具。它接受一个元组作为参数,该元组指定了新数组的形状。
语法:
new_array = original_array.reshape(new_shape)
original_array: 要重塑的 NumPy 数组。
new_shape: 一个元组,指定新数组的形状,例如 (rows, columns) 或 (depth, rows, columns)。
new_array: 重塑后的新数组。
代码示例:
import numpy as np # 创建一个一维数组 arr1 = np.arange(12) print("原始数组:\n", arr1) print("原始数组的形状:", arr1.shape) # 将一维数组重塑为二维数组 (3x4) arr2 = arr1.reshape((3, 4)) print("\n重塑后的二维数组:\n", arr2) print("重塑后的二维数组的形状:", arr2.shape) # 将一维数组重塑为二维数组 (4x3) arr3 = arr1.reshape((4, 3)) print("\n重塑后的二维数组:\n", arr3) print("重塑后的二维数组的形状:", arr3.shape) # 将一维数组重塑为三维数组 (2x2x3) arr4 = arr1.reshape((2, 2, 3)) print("\n重塑后的三维数组:\n", arr4) print("重塑后的三维数组的形状:", arr4.shape) # 错误示例:形状不兼容 try: arr5 = arr1.reshape((5, 3)) # 12个元素无法重塑为 5x3 (15个元素) except ValueError as e: print("\n错误:", e)
输出:
原始数组: [ 0 1 2 3 4 5 6 7 8 9 10 11] 原始数组的形状: (12,) 重塑后的二维数组: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] 重塑后的二维数组的形状: (3, 4) 重塑后的二维数组: [[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11]] 重塑后的二维数组的形状: (4, 3) 重塑后的三维数组: [[[ 0 1 2] [ 3 4 5]] [[ 6 7 8] [ 9 10 11]]] 重塑后的三维数组的形状: (2, 2, 3) 错误: cannot reshape array of size 12 into shape (5,3)
-1 进行自动推断在 reshape() 方法中,可以使用 -1 来表示一个维度的大小由 NumPy 自动推断。 这在你想保留某些维度的大小,但让 NumPy 计算其他维度大小时非常有用。
代码示例:
import numpy as np # 创建一个一维数组 arr = np.arange(24) print("原始数组:\n", arr) print("原始数组的形状:", arr.shape) # 将一维数组重塑为二维数组,让 NumPy 自动推断列数 arr_reshaped = arr.reshape((6, -1)) print("\n重塑后的二维数组:\n", arr_reshaped) print("重塑后的二维数组的形状:", arr_reshaped.shape) # 将一维数组重塑为二维数组,让 NumPy 自动推断行数 arr_reshaped2 = arr.reshape((-1, 8)) print("\n重塑后的二维数组:\n", arr_reshaped2) print("重塑后的二维数组的形状:", arr_reshaped2.shape) # 将一维数组重塑为三维数组,让 NumPy 自动推断第三个维度的大小 arr_reshaped3 = arr.reshape((2, 3, -1)) print("\n重塑后的三维数组:\n", arr_reshaped3) print("重塑后的三维数组的形状:", arr_reshaped3.shape)
输出:
原始数组: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23] 原始数组的形状: (24,) 重塑后的二维数组: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15] [16 17 18 19] [20 21 22 23]] 重塑后的二维数组的形状: (6, 4) 重塑后的二维数组: [[ 0 1 2 3 4 5 6 7] [ 8 9 10 11 12 13 14 15] [16 17 18 19 20 21 22 23]] 重塑后的二维数组的形状: (3, 8) 重塑后的三维数组: [[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] [[12 13 14 15] [16 17 18 19] [20 21 22 23]]] 重塑后的三维数组的形状: (2, 3, 4)
注意: 在 reshape() 中只能使用一个 -1。 如果使用多个 -1,NumPy 将无法确定如何推断形状,并会引发错误。
ravel() 和 flatten() 方法ravel() 和 flatten() 方法用于将多维数组转换为一维数组。 它们之间的主要区别在于 ravel() 返回原始数组的视图 (view),而 flatten() 返回原始数组的副本 (copy)。
ravel(): 返回一个扁平化的一维数组的视图。 如果可能,它会避免复制数据。 对 ravel() 返回的数组的修改可能会影响原始数组。
flatten(): 返回一个扁平化的一维数组的副本。 对 flatten() 返回的数组的修改不会影响原始数组。
代码示例:
import numpy as np # 创建一个二维数组 arr = np.array([[1, 2, 3], [4, 5, 6]]) print("原始数组:\n", arr) print("原始数组的形状:", arr.shape) # 使用 ravel() 扁平化数组 raveled_arr = arr.ravel() print("\n使用 ravel() 扁平化后的数组:\n", raveled_arr) print("扁平化后的数组的形状:", raveled_arr.shape) # 使用 flatten() 扁平化数组 flattened_arr = arr.flatten() print("\n使用 flatten() 扁平化后的数组:\n", flattened_arr) print("扁平化后的数组的形状:", flattened_arr.shape) # 修改 ravel() 返回的数组 raveled_arr[0] = 100 print("\n修改 ravel() 返回的数组后:") print("原始数组:\n", arr) # 原始数组被修改 print("ravel后的数组:\n", raveled_arr) # 修改 flatten() 返回的数组 flattened_arr[0] = 200 print("\n修改 flatten() 返回的数组后:") print("原始数组:\n", arr) # 原始数组未被修改 print("flatten后的数组:\n", flattened_arr)
输出:
原始数组: [[1 2 3] [4 5 6]] 原始数组的形状: (2, 3) 使用 ravel() 扁平化后的数组: [1 2 3 4 5 6] 扁平化后的数组的形状: (6,) 使用 flatten() 扁平化后的数组: [1 2 3 4 5 6] 扁平化后的数组的形状: (6,) 修改 ravel() 返回的数组后: 原始数组: [[100 2 3] [ 4 5 6]] ravel后的数组: [100 2 3 4 5 6] 修改 flatten() 返回的数组后: 原始数组: [[100 2 3] [ 4 5 6]] flatten后的数组: [200 2 3 4 5 6]
transpose() 方法和 .T 属性transpose() 方法和 .T 属性用于交换数组的维度。 对于二维数组,这相当于交换行和列。
语法:
# 使用 transpose() 方法 transposed_array = original_array.transpose() # 使用 .T 属性 transposed_array = original_array.T
代码示例:
import numpy as np # 创建一个二维数组 arr = np.array([[1, 2, 3], [4, 5, 6]]) print("原始数组:\n", arr) print("原始数组的形状:", arr.shape) # 使用 transpose() 方法转置数组 transposed_arr = arr.transpose() print("\n使用 transpose() 转置后的数组:\n", transposed_arr) print("转置后的数组的形状:", transposed_arr.shape) # 使用 .T 属性转置数组 transposed_arr2 = arr.T print("\n使用 .T 属性转置后的数组:\n", transposed_arr2) print("转置后的数组的形状:", transposed_arr2.shape) # 对于更高维度的数组,可以指定维度的顺序 arr3d = np.arange(24).reshape((2, 3, 4)) print("\n原始三维数组:\n", arr3d) print("原始三维数组的形状:", arr3d.shape) # 交换第一和第二个维度 transposed_arr3d = arr3d.transpose((1, 0, 2)) print("\n转置后的三维数组:\n", transposed_arr3d) print("转置后的三维数组的形状:", transposed_arr3d.shape)
输出:
原始数组: [[1 2 3] [4 5 6]] 原始数组的形状: (2, 3) 使用 transpose() 转置后的数组: [[1 4] [2 5] [3 6]] 转置后的数组的形状: (3, 2) 使用 .T 属性转置后的数组: [[1 4] [2 5] [3 6]] 转置后的数组的形状: (3, 2) 原始三维数组: [[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] [[12 13 14 15] [16 17 18 19] [20 21 22 23]]] 原始三维数组的形状: (2, 3, 4) 转置后的三维数组: [[[ 0 1 2 3] [12 13 14 15]] [[ 4 5 6 7] [16 17 18 19]] [[ 8 9 10 11] [20 21 22 23]]] 转置后的三维数组的形状: (3, 2, 4)
NumPy 数组的重塑是数据处理和科学计算中的基本操作。 掌握 reshape(), ravel(), flatten() 和 transpose() 等方法可以帮助你有效地操作数组的形状,以满足不同算法和模型的需求。 记住,重塑操作不会改变数组中的数据,只是改变了数据的组织方式。 确保新形状与原始数组中的元素总数兼容。