在 Python 中,reshape
函数主要用于调整数组或矩阵的维度,尤其常见于 NumPy 和 Pandas 库。以下是详细的用法和示例:
1. NumPy 中的 reshape
NumPy 的 reshape
是调整数组维度的核心工具,适用于科学计算和多维数据处理。
基本语法:
numpy.reshape(array, new_shape, order='C')
或直接调用数组对象的 reshape
方法:
arr.reshape(new_shape)
参数说明:
- **
new_shape
: 目标形状(如(行, 列)
),可以是整数或元组。
关键规则**:新形状的元素总数必须与原数组一致(例如,原数组有 6 个元素,可改为(2,3)
,但不能改为(3,3)
)。 - **
order
**: 可选参数,控制元素填充顺序:'C'
(默认):按行优先(C 风格)填充。'F'
:按列优先(Fortran 风格)填充。
示例代码:
示例 1:一维转二维
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
reshaped = arr.reshape((2, 3)) # 改为 2 行 3 列
print(reshaped)
# 输出:
# [[1 2 3]
# [4 5 6]]
示例 2:多维数组调整
matrix = np.array([[1, 2], [3, 4], [5, 6]])
# 改为 2行3列(总元素数必须为6)
new_matrix = matrix.reshape((2, 3))
print(new_matrix)
# 输出:
# [[1 2 3]
# [4 5 6]]
示例 3:自动推断维度(使用 -1
)
通过 -1
自动计算某一维的大小:
arr = np.array([1, 2, 3, 4, 5, 6])
# 自动计算行数(总元素数=6 → 行数=6/3=2)
reshaped = arr.reshape((-1, 3))
print(reshaped)
# 输出:
# [[1 2 3]
# [4 5 6]]
示例 4:调整维度顺序(order
参数)
arr = np.array([1, 2, 3, 4, 5, 6])
# 按列优先填充
fortran_arr = arr.reshape((2, 3), order='F')
print(fortran_arr)
# 输出:
# [[1 3 5]
# [2 4 6]]
2. Pandas 中的 reshape
Pandas 主要通过以下方法实现数据重塑:
- **
stack()
/unstack()
**: 行列转换。 - **
pivot()
/melt()
**: 宽表与长表转换。
示例:stack
和 unstack
import pandas as pd
# 创建一个 DataFrame
df = pd.DataFrame({
"A": [1, 2, 3],
"B": [4, 5, 6]
}, index=["X", "Y", "Z"])
# 将列堆叠为行(生成多级索引)
stacked = df.stack()
print(stacked)
# 输出:
# X A 1
# B 4
# Y A 2
# B 5
# Z A 3
# B 6
# 恢复原形状
unstacked = stacked.unstack()
print(unstacked)
3. 注意事项
- 元素总数必须一致:否则会抛出
ValueError
。 - 返回的是视图(View)还是副本(Copy):
- NumPy 的
reshape
默认返回视图(修改视图会影响原数组)。 - 若无法生成视图(如内存不连续),则返回副本。
- NumPy 的
- 避免混淆
reshape
和resize
:reshape
不改变原数组,返回新形状的数组。resize
直接修改原数组的形状(可能导致数据截断或填充)。
4. 实际应用场景
- 图像处理:将一维像素数组转换为三维(高度, 宽度, 通道数)。
- 机器学习:调整输入数据的形状以匹配模型要求(如将
(样本数,)
改为(样本数, 1)
)。 - 数据清洗:将宽表转换为长表(Pandas 的
melt
)。
5. 常见错误
# 错误示例:元素总数不匹配
arr = np.array([1, 2, 3])
try:
arr.reshape((2, 2)) # 3元素无法填充2x2=4的位置
except ValueError as e:
print(e) # 输出:cannot reshape array of size 3 into shape (2,2)
通过 reshape
,你可以灵活处理数据维度,适配不同算法和场景的需求。根据任务选择 NumPy(多维数组)或 Pandas(表格数据)的对应方法。