科普:Python / Numpy / PyTorch 的数据拼接方法

记住 3 大类拼接

  1. 横向拼接(左右拼) = 列变多
  2. 纵向拼接(上下拼) = 行变多
  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 完全替代:

  • hstackcat(..., dim=1)
  • vstackcat(..., 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 左右拼

相关推荐
刀法如飞5 小时前
一款Python语言Django框架DDD脚手架,开箱即用
python·架构·django
itzixiao6 小时前
L1-051 打折(5分)[java][python]
java·python·算法
HappyAcmen6 小时前
10.常见报错排查与基础调试
开发语言·python
山川而川-R6 小时前
Windows新系统_安装anaconda-2026-4.24
python
ID_180079054736 小时前
Python 实现京东商品详情 API 数据准确性校验(极简可直接用)
java·前端·python
码农的神经元6 小时前
配电网智能决策平台:从风险感知到自愈控制的 Python 实现
开发语言·python
zhaoshuzhaoshu6 小时前
主流 AI 编程助手工具特点与对比
人工智能·python
Daydream.V6 小时前
Python 多线程编程从入门到精通:基础 + 实战 + 避坑全攻略
python·线程·threading·线程教学
神仙别闹6 小时前
基于Python实现(控制台)个人信息系统
开发语言·python
a9511416426 小时前
c++如何解析二进制协议中的可选字段读取逻辑及其反序列化【详解】
jvm·数据库·python