np.concatenate 适合拼接同维度数组,axis 必须在 [0, ndim) 内且对齐;np.stack 要求形状完全相同并新增一维;vstack/hstack 是 concatenate 的语法糖但 axis 固定;需注意 dtype 提升和内存连续性。

concatenate 适合拼接同维度数组,但 axis 要对得上
如果你的两个 ndarray 形状兼容(比如都是 2D,且除拼接轴外其余维度一致),np.concatenate 是最直接的选择。它不会新增维度,只是把数组“缝”在一起。
常见错误是 axis 设错导致 ValueError: all the input arrays must have same number of dimensions 或 axis out of bounds。比如两个形状为 (3, 4) 的数组,axis=0 拼成 (6, 4),axis=1 拼成 (3, 8);但设 axis=2 就会报错——它们根本没第 2 轴。
- 确保输入数组维度数相同,否则先用
np.expand_dims或reshape对齐 -
axis值必须在[0, ndim)范围内,负值如-1表示最后一轴 - 性能上,
concatenate是原地拼接的底层操作,比多次vstack/hstack更轻量
stack 必须所有数组形状完全一致,且会增加一维
np.stack 不是拼接,而是“堆叠”:它要求所有输入数组 shape 完全相同,并在指定 axis 上新增一个维度。结果数组的维度比输入高 1。
典型误用是拿 (3, 4) 和 (3, 5) 的数组去 stack,立刻报 ValueError: all input arrays must have the same shape。它和 concatenate 的语义完全不同——一个加层,一个延展。
立即学习“Python免费学习笔记(深入)”;
- 想把两个
(3, 4)数组合成(2, 3, 4)?用np.stack([a, b], axis=0) - 想变成
(3, 2, 4)?用axis=1;想变成(3, 4, 2)?用axis=2 - 如果只是想“并排”或“上下堆”,别用
stack,那是concatenate或vstack/hstack的活
vstack/hstack 是 concatenate 的语法糖,但 axis 固定
np.vstack 等价于 concatenate(..., axis=0),np.hstack 默认 axis=1(对 2D)或 axis=0(对 1D),行为略不统一。它们读起来更直观,但灵活性不如 concatenate。
容易踩的坑是混用维度:比如对两个 1D 数组 vstack 得到 (2, N),但 hstack 会得到 (2*N,);而对 2D 数组,hstack 实际调的是 concatenate(..., axis=1)。这种隐式规则在调试时容易绕晕。
- 明确知道要沿哪轴拼?直接用
concatenate,少一层抽象 - 写脚本给同事看,追求可读性?
vstack([a, b])比concatenate([a, b], axis=0)更直白 - 注意
np.column_stack和np.row_stack是更安全的替代,尤其处理 1D 输入时
合并前务必检查 dtype 和内存连续性
拼接后数组的 dtype 由 NumPy 的类型提升规则决定。比如 int32 和 float64 合并,默认升为 float64,可能悄悄吃掉内存。更隐蔽的问题是,concatenate 返回的数组未必是 C-contiguous(行优先),某些后续操作(如传给 Cython 或某些深度学习框架)会失败或降速。
- 强制指定输出类型:
concatenate([a, b], dtype=np.float32) - 检查连续性:
arr.flags.c_contiguous,必要时用np.ascontiguousarray(arr) - 如果合并后要频繁切片或参与计算,建议合并完立刻做一次
.copy(),避免视图引用带来的意外共享


















