np.concatenate()默认axis=0(垂直拼接),横向需显式指定axis=1;vstack/hstack行为特殊,尤其对1D数组;多次调用concatenate性能差,应一次性拼接或预分配。
拼接方向搞错:
默认按 axis=0 合并,不是“自动识别横竖”
很多人以为
会像
或
那样“智能判断方向”,其实它完全依赖
参数。不显式指定
,就按第 0 轴(行方向)合并,等价于
—— 即堆叠成更高数组,而不是更宽。
想横向拼(列方向),必须写
,否则报
或形状不匹配
底层就是
,
在 2D 数组下等价于
,但注意:
对 1D 数组行为特殊(会先转成列向量再水平拼)
如果数组维度不一致(比如一个 (3, 4),另一个 (3,)),
直接报错;而
/
会尝试广播或隐式升维,反而容易掩盖问题
1D 数组拼接时
和
行为反直觉
对一维数组,
会把每个
、
当作“一行”,结果是二维的;而
是真正把元素首尾相连,返回一维数组 —— 这和名字的“v/h”直观感受相反。
(2×2)
(1D,长度 4)
这时用
才等价于
;想等价
,得先
或改用
+ 显式二维输入
性能与内存:多次
比预分配后赋值慢得多
每次都新建数组、拷贝数据。循环里反复调用,时间复杂度是 O(n²),尤其拼大数组时延迟明显。
避免:
推荐:先收集所有数组到列表,一次拼完 ——
若拼接逻辑复杂(如条件过滤后拼),考虑预分配目标数组(用
或
),再用切片赋值,比反复
快一个数量级以上
/
内部也是调
,所以同样有这问题,别以为换函数就自动优化
常见错误:形状不兼容却没立刻报错
最典型的坑是拼接时某维长度不一致但其他维碰巧对得上,导致运行时不报错、结果错得隐蔽。比如两个数组都是 2D,但一个 (5, 3),另一个 (5, 4),用
拼会崩;但如果一个是 (5, 3),另一个是 (5, 1),
不报错,但你可能根本没意识到发生了广播式拼接(实际不会广播,这里指人为误判)—— 真正危险的是维度数不同还硬拼。
错误示例:
→ 报错,因为 (3,) 不能直接在 axis=1 拼到 (3, 4) 上
但
成功,结果是 (3, 5),容易漏看末尾多了一列全 1
建议拼之前加检查:
(对 axis=0);或用
预探路
事情说清了就结束
np.concatenate()np.concatenate()vstackhstackaxisaxisvstackaxis=1ValueError: all the input arrays must have same number of dimensionsvstackconcatenate(..., axis=0)hstackconcatenate(..., axis=1)hstackconcatenatevstackhstackvstackhstackvstack([a, b])abhstack([a, b])a = np.array([1, 2]); b = np.array([3, 4])vstack([a, b]) → array([[1, 2], [3, 4]])hstack([a, b]) → array([1, 2, 3, 4])concatenate([a, b])hstackvstackreshape(-1, 1)axis=0concatenatenp.concatenate()res = arr0; for a in arr_list: res = np.concatenate([res, a])np.concatenate(arr_list)np.emptynp.zerosconcatenatevstackhstackconcatenateaxis=1concatenatenp.concatenate([np.ones((3, 4)), np.ones((3,))], axis=1)np.concatenate([np.ones((3, 4)), np.ones((3, 1))], axis=1)all(a.shape[1:] == arr_list[0].shape[1:] for a in arr_list)np.broadcast_arrays