在数据分析、科学计算以及机器学习中,经常需要将多个数组组合为一个整体。例如:

• 合并多个数据批次

• 按列拼接特征

• 按行堆叠样本

• 构造高维张量或分块矩阵

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() 等函数则提供了更高层的语义封装。需要特别注意,不同函数在是否新增维度、输入形状要求以及一维数组处理方式方面存在差异,在实际应用中应根据数据结构与计算目标合理选择。

打开网易新闻 查看精彩图片

点赞有美意,赞赏是鼓励