杰瑞科技汇

python numpy 矩阵拼接

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

python numpy 矩阵拼接-图1
(图片来源网络,侵删)

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 数组拼接

python numpy 矩阵拼接-图2
(图片来源网络,侵删)
# 创建两个 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 - 垂直堆叠

vstacknp.concatenateaxis=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 - 水平堆叠

hstacknp.concatenateaxis=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.vstacknp.hstack 会让代码更具可读性。
  • 如果你需要沿着一个不常见的轴(3D 数组的深度轴 axis=0)进行拼接,或者需要在一个循环中动态拼接多个数组np.concatenate 是更灵活的选择。
  • 注意np.vstacknp.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 的矩阵拼接!

python numpy 矩阵拼接-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇