记住 3 大类拼接
- 横向拼接(左右拼) = 列变多
- 纵向拼接(上下拼) = 行变多
- 维度拼接(任意维度) = 通用
一、NumPy 数组拼接(ndarray)
先构造两个简单数组:
python
import numpy as np
a = np.array([[1, 2],
[3, 4]]) # shape (2,2)
b = np.array([[5, 6],
[7, 8]]) # shape (2,2)
1. 横向拼接 np.hstack
水平拼接,列增加
python
c = np.hstack((a, b)) # h = horizontal
print(c)
print(c.shape) # (2, 4)
[[1 2 5 6]
[3 4 7 8]]
2. 纵向拼接 np.vstack
垂直拼接,行增加
python
c = np.vstack((a, b)) # v = vertical
print(c)
print(c.shape) # (4, 2)
[[1 2]
[3 4]
[5 6]
[7 8]]
3. 通用拼接 np.concatenate
axis=0→ 垂直(行方向),上下拼 = 增加行axis=1→ 水平(列方向),左右拼 = 增加列
python
# 垂直拼接 = vstack
c = np.concatenate([a, b], axis=0) #shape (4,2)
# 水平拼接 = hstack
c = np.concatenate([a, b], axis=1) #shape (2,4)
4. 新增维度拼接 np.stack
会多出来一个维度
python
c = np.stack([a, b], axis=0)
print(c.shape) # (2, 2, 2)
即:
c=
\[\[1 2
3 4\]
\[5 6
7 8\]
]
二、Python 原生 list 拼接
python
list1 = [1, 2, 3]
list2 = [4, 5, 6]
1. + 拼接
python
list3 = list1 + list2 # [1,2,3,4,5,6]
2. .extend()
python
list1.extend(list2) # list1 变成 [1,2,3,4,5,6]
⚠️ 注意:
list 没有行列概念,只能简单拼接,不能按维度拼接
三、PyTorch 张量拼接(torch.Tensor)
python
import torch
a = torch.tensor([[1,2],[3,4]]) # (2,2)
b = torch.tensor([[5,6],[7,8]]) # (2,2)
1. torch.cat 最常用
python
# 垂直拼接(行增加)dim=0
c = torch.cat([a, b], dim=0) # (4,2)
# 水平拼接(列增加)dim=1
c = torch.cat([a, b], dim=1) # (2,4)
2. torch.stack 新增维度
python
c = torch.stack([a, b], dim=0)
print(c.shape) # (2, 2, 2)
3. 没有专门的 hstack / vstack
但可以用 cat 完全替代:
hstack≈cat(..., dim=1)vstack≈cat(..., dim=0)
五、总结表
| 类型 | 横向拼接(列) | 纵向拼接(行) | 新增维度 |
|---|---|---|---|
| NumPy | np.hstack |
np.vstack |
np.stack |
np.concatenate(axis=1) |
np.concatenate(axis=0) |
||
| Torch | torch.cat(dim=1) |
torch.cat(dim=0) |
torch.stack |
| List | list1 + list2 |
list1 + list2 |
不支持 |
六、NumPy 拼接 ↔ PyTorch 张量拼接
在深度学习领域,通常使用张量(如,PyTorch 张量),为此我们专门讨论一下"NumPy 拼接 ↔ PyTorch 张量拼接"。
0. 先构造数据
python
import numpy as np
import torch
# 两个 (2,1) 数组,模拟你代码里的 oof_1, oof_2
a_np = np.array([[1], [2]]) # shape (2,1)
b_np = np.array([[3], [4]]) # shape (2,1)
a_torch = torch.tensor([[1], [2]]) # shape (2,1)
b_torch = torch.tensor([[3], [4]])
1. 横向拼接(列拼接 → 特征变多)
NumPy 方式
python
# 水平拼接
h_np = np.hstack([a_np, b_np])
print(h_np)
print(h_np.shape) # (2, 2)
结果:
[[1 3]
[2 4]]
等价通用写法:
python
h_np2 = np.concatenate([a_np, b_np], axis=1)
PyTorch 对应方式
python
h_torch = torch.cat([a_torch, b_torch], dim=1)
print(h_torch)
print(h_torch.shape) # torch.Size([2, 2])
效果完全一样!
2. 纵向拼接(行拼接 → 样本变多)
NumPy
python
v_np = np.vstack([a_np, b_np])
print(v_np.shape) # (4,1)
等价:
python
v_np2 = np.concatenate([a_np, b_np], axis=0)
PyTorch
python
v_torch = torch.cat([a_torch, b_torch], dim=0)
print(v_torch.shape) # torch.Size([4,1])
3. 新增维度拼接(stack)
NumPy
python
s_np = np.stack([a_np, b_np], axis=0)
print(s_np.shape) # (2, 2, 1)
PyTorch
python
s_torch = torch.stack([a_torch, b_torch], dim=0)
print(s_torch.shape) # torch.Size([2, 2, 1])
4. 对照表
| 操作 | NumPy | PyTorch | 效果 |
|---|---|---|---|
| 横向拼接(列) | np.hstack([a,b]) |
torch.cat([a,b], dim=1) |
特征增加 |
| 纵向拼接(行) | np.vstack([a,b]) |
torch.cat([a,b], dim=0) |
样本增加 |
| 通用拼接 | np.concatenate(..., axis=) |
torch.cat(..., dim=) |
任意维度 |
| 新增维度 | np.stack(..., axis=) |
torch.stack(..., dim=) |
维度+1 |
- numpy:
hstack/vstack/concatenate(axis=...) - torch:统一用
torch.cat(dim=...) dim=0上下拼,dim=1左右拼