在数据分析、科学计算以及机器学习中,除了将多个数组拼接在一起,还经常需要将一个数组拆分为多个子数组。例如:

• 将数据集划分为训练集与测试集

• 按列拆分特征

• 按批次分割数据

• 将大数组切分为若干块进行并行处理

NumPy 提供了一组用于数组拆分的函数。需要注意的是,这些函数返回的子数组通常是原数组上的视图(view),因此对子数组的修改往往会影响原数组。

按照功能划分,NumPy 中常见的数组拆分函数通常可以分为以下几类:

(1)等分拆分

(2)不等分拆分

(3)按方向拆分接口(基于 split)

一、等分拆分

split()

将数组沿指定轴等分为多个子数组。严格等分,要求可整除。返回由子数组组成的列表。

numpy.split(ary, indices_or_sections, axis=0)

参数说明:

• ary:输入数组

• indices_or_sections:拆分规则

- 序列:表示切分位置(索引)。序列中的值表示“切分点索引”(左闭右开区间边界)

• axis:拆分轴(默认 0)

示例 1:按份数拆分

np.split(a, 3)

输出:

[array([1, 2]), array([3, 4]), array([5, 6])]

说明:若使用整数等分,数组长度必须能整除,否则会抛出错误。

示例 2:按索引拆分

np.split(a, [2, 4])

输出:

[array([1, 2]), array([3, 4]), array([5, 6])]

说明:序列中的值表示切分点索引,其划分规则遵循 Python 切片语义(左闭右开区间)。

切分点 [2, 4] 表示:

a[4:]  → [5, 6]

示例 3:越界索引

np.split(a, [2, 10])

输出(示意):

[array([1, 2]), array([3, 4, 5, 6]), array([], dtype=int64)]

说明:当切分点超出数组边界时,NumPy 会返回空数组段,而不会自动报错。

二、不等分拆分

array_split()

将数组拆分为多个子数组。灵活拆分,允许不等分。

numpy.array_split(ary, indices_or_sections, axis=0)

参数说明(同 split())。

示例:

np.array_split(a, 3)

输出:

[array([1, 2]), array([3, 4]), array([5])]

说明:不要求整除,前面的子数组可能更大。

三、按方向拆分接口(基于 split)

以下函数是对 split() 的语义封装。

hsplit()

按列方向拆分数组(axis=1)。

说明:对二维及更高维数组,hsplit() 等价于沿 axis=1 调用 split();对于一维数组,它等价于沿 axis=0 进行拆分。

numpy.hsplit(ary, indices_or_sections)

参数说明:

• ary:输入数组

• indices_or_sections:拆分规则

示例:

np.hsplit(A, 2)           

输出:

        [7, 8]])]

说明:等价于 split(ary, ..., axis=1),要求列数可整除(使用整数时)。

vsplit()

按行方向拆分数组(axis=0)。

numpy.vsplit(ary, indices_or_sections)

参数说明(同 split())。

示例:

np.vsplit(A, 2)

输出:

[array([[1, 2, 3, 4]]), array([[5, 6, 7, 8]])]

说明:等价于 split(ary, ..., axis=0)。

vsplit() 要求输入数组至少是二维,否则会报错。

dsplit()

沿第三轴拆分数组(axis=2)。

numpy.dsplit(ary, indices_or_sections)

参数说明(同 split())。

示例:

np.dsplit(A, 2)

输出:

         [7]]])]

说明:这里 A.shape = (1, 4, 2),沿 axis=2 拆成 2 份后,每份形状应是 (1, 4, 1)。

dsplit() 要求输入数组至少为三维,否则会报错。

dsplit() 常用于图像通道拆分(此时 axis=2 通常表示通道维)。

小结

NumPy 提供了一组用于数组拆分的函数体系,其中 split() 用于严格等分拆分,array_split() 用于灵活拆分,而 hsplit()、vsplit() 与 dsplit() 则分别对应列、行及第三轴方向的拆分操作。需要注意,不同函数在是否要求整除、拆分轴以及输入维度要求方面存在差异,在实际应用中应根据数据结构与任务需求合理选择。

点赞有美意,赞赏是鼓励