np.concatenate, np.vstack (垂直堆叠), 和 np.hstack (水平堆叠)。

np.concatenate - 最通用的方法
这是最基本、最通用的拼接函数,它可以在一个给定的轴(axis)上连接一系列数组。
语法
numpy.concatenate((a1, a2, ...), axis=0)
(a1, a2, ...): 一个包含要拼接的数组的元组或列表。axis: 指定沿着哪个轴进行拼接,默认是axis=0(垂直方向,即行)。
关键点
- 形状匹配:除了用于拼接的轴(
axis指定的轴)之外,其他所有维度的形状必须完全相同。
示例
示例 1: 沿轴 0 拼接 (垂直堆叠,增加行数)
import numpy as np
# 创建两个 2x3 的矩阵
A = np.array([[1, 2, 3],
[4, 5, 6]])
B = np.array([[7, 8, 9],
[10, 11, 12]])
# 沿轴 0 拼接
C = np.concatenate((A, B), axis=0)
print("矩阵 A:\n", A)
print("矩阵 B:\n", B)
print("沿轴 0 拼接后的矩阵 C:\n", C)
# 输出:
# 矩阵 A:
# [[1 2 3]
# [4 5 6]]
# 矩阵 B:
# [[ 7 8 9]
# [10 11 12]]
# 沿轴 0 拼接后的矩阵 C:
# [[ 1 2 3]
# [ 4 5 6]
# [ 7 8 9]
# [10 11 12]]
示例 2: 沿轴 1 拼接 (水平堆叠,增加列数)
# 沿轴 1 拼接
D = np.concatenate((A, B), axis=1)
print("沿轴 1 拼接后的矩阵 D:\n", D)
# 输出:
# 沿轴 1 拼接后的矩阵 D:
# [[ 1 2 3 7 8 9]
# [ 4 5 6 10 11 12]]
示例 3: 3D 数组拼接

# 创建两个 2x2x3 的 3D 数组
A_3d = np.array([[[1, 2, 3], [4, 5, 6]],
[[7, 8, 9], [10, 11, 12]]])
B_3d = np.array([[[13, 14, 15], [16, 17, 18]],
[[19, 20, 21], [22, 23, 24]]])
# 沿轴 0 (深度方向) 拼接
C_3d = np.concatenate((A_3d, B_3d), axis=0)
print("A_3d 形状:", A_3d.shape) # (2, 2, 3)
print("C_3d 形状:", C_3d.shape) # (4, 2, 3)
# 沿轴 1 (高度方向) 拼接
D_3d = np.concatenate((A_3d, B_3d), axis=1)
print("D_3d 形状:", D_3d.shape) # (2, 4, 3)
np.vstack - 垂直堆叠
vstack 是 np.concatenate 在 axis=0 上的一个便捷封装,它专门用于垂直堆叠数组,即在一个数组之上添加另一个数组。
语法
numpy.vstack(tup)
tup: 一个包含要堆叠的数组的元组或列表。
关键点
- 它会自动处理维度,如果输入是一维数组,它会先将它们视为行向量,然后堆叠成二维矩阵。
- 形状匹配:除了第一个轴(行)之外,其他所有维度的形状必须相同。
示例
import numpy as np
A = np.array([[1, 2, 3],
[4, 5, 6]])
B = np.array([[7, 8, 9],
[10, 11, 12]])
# 使用 vstack 垂直堆叠
C = np.vstack((A, B))
print("使用 vstack 拼接后的矩阵 C:\n", C)
# 输出与 np.concatenate((A, B), axis=0) 完全相同
# [[ 1 2 3]
# [ 4 5 6]
# [ 7 8 9]
# [10 11 12]]
# 处理一维数组
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.vstack((a, b))
print("一维数组 vstack 结果:\n", c)
# [[1 2 3]
# [4 5 6]]
np.hstack - 水平堆叠
hstack 是 np.concatenate 在 axis=1 上的一个便捷封装,它专门用于水平堆叠数组,即在一个数组旁边添加另一个数组。
语法
numpy.hstack(tup)
tup: 一个包含要堆叠的数组的元组或列表。
关键点
- 它会自动处理维度,如果输入是一维数组,它会将它们连接成一个更长的一维数组。
- 形状匹配:除了第二个轴(列)之外,其他所有维度的形状必须相同。
示例
import numpy as np
A = np.array([[1, 2, 3],
[4, 5, 6]])
B = np.array([[7, 8, 9],
[10, 11, 12]])
# 使用 hstack 水平堆叠
C = np.hstack((A, B))
print("使用 hstack 拼接后的矩阵 C:\n", C)
# 输出与 np.concatenate((A, B), axis=1) 完全相同
# [[ 1 2 3 7 8 9]
# [ 4 5 6 10 11 12]]
# 处理一维数组
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.hstack((a, b))
print("一维数组 hstack 结果:\n", c)
# [1 2 3 4 5 6]
总结与对比
| 函数 | 全称 | 拼接方向 | 等价的 concatenate |
适用场景 |
|---|---|---|---|---|
np.concatenate |
concatenate | 任意轴 (由 axis 参数决定) |
np.concatenate((a, b), axis=0) |
最通用,可以沿任意轴拼接,但需要确保非拼接轴的形状一致。 |
np.vstack |
vertical stack | 垂直 (增加行) | np.concatenate((a, b), axis=0) |
专门用于垂直堆叠,代码更直观,适合垂直方向拼接。 |
np.hstack |
horizontal stack | 水平 (增加列) | np.concatenate((a, b), axis=1) |
专门用于水平堆叠,代码更直观,适合水平方向拼接。 |
如何选择?
- 如果你只是想简单地上下或左右拼接,使用
np.vstack或np.hstack会让代码更具可读性。 - 如果你需要沿着一个不常见的轴(3D 数组的深度轴
axis=0)进行拼接,或者需要在一个循环中动态拼接多个数组,np.concatenate是更灵活的选择。 - 注意:
np.vstack和np.hstack在处理一维数组时非常有用,而np.concatenate在处理一维数组并指定axis=0时,结果会是一个二维数组,这可能不是你想要的。
常见错误:形状不匹配
拼接时最常见的错误是形状不匹配。
import numpy as np
A = np.array([[1, 2, 3],
[4, 5, 6]]) # shape (2, 3)
B = np.array([[7, 8],
[9, 10]]) # shape (2, 2)
# 尝试水平拼接,会报错,因为列数不匹配 (3 != 2)
try:
C = np.hstack((A, B))
except ValueError as e:
print("错误:", e)
# 错误: all the input arrays must have same number of dimensions, but the array at index 0 has 2 dimension(s) and the array at index 1 has 1 dimension(s)
# 修正 B 的形状
B_corrected = np.array([[7, 8, 9],
[10, 11, 12]]) # shape (2, 3)
# 现在可以成功拼接
C = np.hstack((A, B_corrected))
print("修正后的拼接结果:\n", C)
希望这个详细的解释能帮助你完全掌握 NumPy 的矩阵拼接!

