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