numpy中的reshape,resize,transpose,swapaxes,flatten
torch中的view,transpose,reshape,permute,flatten
在NumPy和PyTorch中,许多张量操作方法功能相似但存在细节差异。以下是它们的对比分析:
一、Reshape 操作
1 NumPy: reshape
返回视图(如果内存连续),否则返回副本,不修改原数组。
a = np.arange(6).reshape(2, 3)
2 PyTorch: view
类似reshape,但要求张量内存连续(否则报错),不复制数据,返回视图。
b = torch.arange(6).view(2, 3)
x = x.contiguous().view(3, 4) # 强制连续后使用view()
3 PyTorch: reshape
兼容view,但自动处理非连续张量(可能触发复制)。reshape操作相当于先把向量展平成一位向量,再重新规划矩阵形状。
c = torch.arange(6).reshape(2, 3)
特性 | reshape | view |
内存连续性要求 | 无(自动处理) | 必须连续 |
返回类型 | 视图(连续时)或副本(非连续时) | 视图(必须连续) |
适用场景 | 通用形状调整 | 已知连续的快速形状调整 |
二、调整大小
NumPy: resize
直接修改原数组形状,可扩展或截断数据
a = np.array([1,2,3])
a.resize(5) # 结果:[1,2,3,0,0]
三、转置操作
NumPy: transpose
反转轴顺序或指定轴交换,相当于torch中的transpose+permute。
a = np.arange(6).reshape(2,3)
a.transpose() # 等价于 a.T
NumPy: swapaxes
交换两个指定轴。
a = np.ones((2,3,4))
a.swapaxes(0, 2) # 形状变为 (4,3,2)
PyTorch: transpose
交换两个指定维度。
b = torch.arange(6).view(2,3)
b.transpose(0, 1) # 形状变为 (3,2)
PyTorch: permute
更灵活的维度重排,可指定所有维度的顺序。
c = torch.rand(2,3,4)
c.permute(2,0,1) # 形状变为 (4,2,3)
四、展平操作
NumPy: flatten
返回一维副本(无论内存是否连续)。
a = np.array([[1,2], [3,4]])
a.flatten() # [1,2,3,4]
PyTorch: view(-1)
返回一维视图(要求内存连续)。
b = torch.tensor([[1,2], [3,4]]).view(-1)
PyTorch: torch.flatten()
类似NumPy的flatten,但支持指定起始维度。
c = torch.rand(2,3,4)
torch.flatten(c, start_dim=1) # 形状变为 (2, 12)