NumPy 函数手册:数组拼接与堆叠

NumPy 函数手册:数组拼接与堆叠 在数据分析、科学计算以及机器学习中经常需要将多个数组组合为一个整体。例如• 合并多个数据批次• 按列拼接特征• 按行堆叠样本• 构造高维张量或分块矩阵NumPy 提供了一组用于数组拼接与堆叠的函数。需要注意的是这些操作均返回新数组不会原地修改输入数组。按照功能划分NumPy 中常见的数组拼接与堆叠函数通常可以分为以下几类1沿已有轴拼接2沿新轴堆叠3分块拼接结构拼接4按方向组织的便捷拼接接口5列向量/行方向便捷接口6简化拼接接口一、沿已有轴拼接concatenate()沿指定轴将多个数组连接起来。返回拼接后的新数组。numpy.concatenate((a1, a2, ...), axis0, outNone, dtypeNone, castingsame_kind)参数说明• (a1, a2, ...)待拼接的数组序列形状需兼容• axis拼接轴默认 0• out可选输出数组• dtype目标数据类型• casting类型转换规则no禁止任何类型转换equiv仅允许字节序等价转换不改变数据类型本质safe只允许安全转换不会丢失信息same_kind默认选项允许同类型转换如 int → floatunsafe允许任意转换可能丢失信息示例 1按行拼接import numpy as np a np.array([[1, 2], [3, 4]]) b np.array([[5, 6]]) np.concatenate((a, b), axis0)输出[[1 2] [3 4] [5 6]]示例 2按列拼接np.concatenate((a, a), axis1)输出[[1 2 1 2] [3 4 3 4]]示例 3展平拼接axisNonenp.concatenate((a, b), axisNone)输出[1 2 3 4 5 6]说明当 axisNone 时所有输入数组会先被展平成一维数组再进行拼接。特别说明所有拼接函数的基础形式是除拼接轴外其余维度必须一致。二、沿新轴堆叠stack()在新轴上堆叠数组从而构造更高维结构。返回堆叠后的新数组。numpy.stack(arrays, axis0)参数说明• arrays数组序列形状必须完全一致• axis新轴的位置示例 1a np.array([1, 2, 3]) # a.shape 为 (3, )b np.array([4, 5, 6]) # b.shape 为 (3, ) np.stack((a, b), axis0) # 堆叠后数组的形状为 (2, 3)输出[[1 2 3] [4 5 6]]说明axis0 表示在第 0 轴插入新维度。示例 2a np.array([[1], # a.shape 为 (3, 1) [2], [3]]) b np.array([[4], # b.shape 为 (3, 1) [5], [6]]) np.stack((a, b), axis1) # 堆叠后数组的形状为 (3, 2, 1)输出[[[1] [4]] [[2] [5]] [[3] [6]]]说明axis1 表示在第 1 轴插入新维度。stack() 新增维度的尺寸与输入数组的个数一致。三、分块拼接结构拼接block()按照嵌套列表结构将多个数组拼接为一个整体数组。返回拼接后的新数组。numpy.block(arrays)参数说明• arrays嵌套列表list of lists用于描述拼接结构示例 1二维块拼接A np.array([[1, 2]])B np.array([[3, 4]])C np.array([[5, 6]]) np.block([[A, B], [C, A]])输出[[1 2 3 4] [5 6 1 2]]说明该结构等价于分块矩阵[A B][C A]示例 2构造块对角矩阵I np.eye(2) # I.shape 为 (2, 2)Z np.zeros((2, 2)) # Z.shape 为 (2, 2) np.block([[I, Z], # 拼接后数组的形状为 (4, 4) [Z, I]])输出[[1. 0. 0. 0.] [0. 1. 0. 0.] [0. 0. 1. 0.] [0. 0. 0. 1.]]说明• 同一“行块”中的数组必须在行数上兼容• 同一“列块”中的数组必须在列数上兼容block() 本质上是对 concatenate() 的递归封装。四、按方向组织的便捷拼接接口以下函数是对 concatenate() 的语义封装。vstack()按行方向拼接数组axis0。numpy.vstack(tup)参数说明• tup数组序列由多个数组对象按顺序组成的可迭代容器可以是元组、列表或其它可迭代对象示例 1a np.array([[1, 2], # a.shape 为 (2, 2) [3, 4]]) b np.array([5, 6]) # b.shape 为 (2, ) np.vstack((a, b)) # 拼接后数组的形状为 (3, 2)输出[[1 2] [3 4] [5 6]]说明一维数组会先转为二维行向量。示例 2a np.array([[1, 2, 3], # a.shape 为 (2, 3) [4, 5, 6]]) b np.array([[7, 8, 9]]) # b.shape 为 (1, 3) np.vstack((a, b)) # 拼接后数组的形状为 (3, 3)输出[[1 2 3] [4 5 6] [7 8 9]]说明vstack() 会先将一维输入视为二维行向量再沿第 0 轴拼接对二维数组而言可理解为等价于 concatenate(..., axis0)。hstack()按列方向拼接数组。numpy.hstack(tup)示例a np.array([[1, 2], # a.shape 为 (2, 2) [3, 4]]) b np.array([[5], # b.shape 为 (2, 1) [6]]) np.hstack((a, b)) # 拼接后数组的形状为 (2, 3)输出[[1 2 5] [3 4 6]]说明对二维及更高维数组hstack() 等价于沿 axis1 调用 concatenate()对于一维数组它等价于沿 axis0 进行拼接。dstack()沿第三轴拼接数组。numpy.dstack(tup)示例a np.array([[1, 2, 3, 4], # a.shape 为 (2, 4) [5, 6, 7, 8]]) b np.array([[10, 20, 30, 40], # b.shape 为 (2, 4) [50, 60, 70, 80]]) c np.array([[100, 200, 300, 400], # c.shape 为 (2, 4) [500, 600, 700, 800]]) d np.dstack((a, b, c)) # d.shape 为 (2, 4, 3)输出[[[ 1 10 100] [ 2 20 200] [ 3 30 300] [ 4 40 400]] [[ 5 50 500] [ 6 60 600] [ 7 70 700] [ 8 80 800]]]说明dstack() 会先将输入调整为至少三维再沿第三个轴axis2进行拼接。对于二维输入可理解为在结果中形成“深度”方向的组合。五、列向量/行方向便捷接口column_stack()按列堆叠数组。numpy.column_stack(tup)参数说明• tup数组序列示例 1a np.array([1, 2, 3])b np.array([4, 5, 6]) np.column_stack((a, b))输出[[1 4] [2 5] [3 6]]说明一维数组会被视为列向量。示例 2a np.array([[1], [2], [3]]) b np.array([[4], [5], [6]]) np.column_stack((a, b))输出[[1 4] [2 5] [3 6]]说明column_stack() 要求数组的第一维长度一致。对于二维输入它的效果可理解为按列执行 hstack()对于一维输入会先将每个输入视为列向量再进行横向拼接。row_stack()按行堆叠数组。numpy.row_stack(tup)示例a np.array([[1, 2, 3]])b np.array([[4, 5, 6]]) np.row_stack((a, b))输出[[1 2 3] [4 5 6]]说明row_stack() 的行为与 vstack() 一致通常可视为其等价接口。在实际使用中vstack() 更常见。六、简化拼接接口append()在数组末尾追加元素。总是返回数组副本copy。numpy.append(arr, values, axisNone)参数说明• arr输入数组• values追加的数据• axis拼接轴示例 1a np.array([1, 2, 3]) np.append(a, 4)输出[1 2 3 4]说明在数组末尾添加新元素。示例 2二维数组指定轴a np.array([[1, 2], [3, 4]]) b np.array([[5, 6]]) np.append(a, b, axis0)输出[[1 2] [3 4] [5 6]]示例 3axisNone展平后追加np.append(a, [5, 6])输出[1 2 3 4 5 6]说明• append() 本质是 concatenate() 的简化形式• 当 axisNone 时会先将数组展平后再拼接• append() 不会原地扩展原数组而是返回拼接后的新数组 小结NumPy 提供了一套完整的数组拼接与堆叠机制其中 concatenate() 用于沿已有轴拼接stack() 用于创建新维度block() 用于构造分块结构而 vstack()、hstack()、column_stack() 等函数则提供了更高层的语义封装。需要特别注意不同函数在是否新增维度、输入形状要求以及一维数组处理方式方面存在差异在实际应用中应根据数据结构与计算目标合理选择。“点赞有美意赞赏是鼓励”