NumPy 数组重塑
文章目录
- 数组重塑(Reshaping of Arrays)
 - 1. 基本用法
 - 2. 核心规则
 - 3. 参数说明
 - 4. 应用场景
 - 5. 注意事项
 - 6. 扩展方法
 
数组重塑(Reshaping of Arrays)
NumPy 允许通过 reshape 方法或 np.reshape 函数改变数组的维度结构,而无需修改底层数据。这种操作在数据预处理、矩阵运算和机器学习中极为常见。
1. 基本用法
import numpy as np# 一维数组 → 二维数组(3行2列)
arr = np.arange(6)        # [0 1 2 3 4 5]
reshaped = arr.reshape(3, 2)
print(reshaped)
# 输出:
# [[0 1]
#  [2 3]
#  [4 5]]
 
2. 核心规则
- (1)元素总数不变:新形状的各维度乘积必须等于原数组元素总数
 
# 错误示例:6元素无法重塑为3x3
arr.reshape(3,3)  # 报错: ValueError: cannot reshape array of size 6 into shape (3,3)
 

- (2) 自动计算维度:可用 -1 自动推断某维度大小
 
# 自动计算列数(总元素6 → 行2 → 列3)
arr.reshape(2, -1)  # 输出: [[0 1 2], [3 4 5]]
 
- (3)内存共享:默认返回视图(共享数据),除非使用 
copy=True 
reshaped[0,0] = 100
print(arr)  # 输出: [100   1   2   3   4   5] → 原数组被修改!
 
3. 参数说明
| 参数  | 说明 | 
|---|---|
| newshape | 目标形状(整数或元组,如 (行, 列) 或 (通道, 高, 宽)) | 
| order | 数据填充顺序(默认 ‘C’ 按行优先,‘F’ 按列优先,‘A’ 保留原顺序) | 
4. 应用场景
- (1)图像处理:将一维像素数据转换为三维张量(高×宽×通道)
 
flat_image = np.random.rand(3072)  # CIFAR-10图像展平后
image_3d = flat_image.reshape(32, 32, 3)  # 还原为32x32 RGB图像
 
- (2)模型输入:适配神经网络输入形状
 
# 将批量数据(100样本,每样本784特征)转为100x28x28
X_train = X_flatten.reshape(100, 28, 28)
 
- (3)矩阵运算:满足线性代数维度要求
 
vector = np.array([1,2,3])
column_matrix = vector.reshape(-1,1)  # 3x1列向量
 

5. 注意事项
| 操作  | 结果 | 
|---|---|
| 原数组连续内存(C顺序) | reshape 高效生成视图( O ( 1 ) O(1) O(1)时间复杂度) | 
| 原数组非连续内存 | 可能触发隐式拷贝(order='A' 时优先保留布局) | 
| 需强制拷贝 | 使用 arr.reshape(...).copy() 或 np.reshape(arr, ..., copy=True) | 
6. 扩展方法
- flatten():将多维数组展平为一维(返回副本)
 - ravel():将多维数组展平为一维(返回视图,优先使用)
 
print(reshaped.ravel())  # 输出: [100 1 2 3 4 5]
