在数据分析、科学计算以及机器学习中,除了将多个数组拼接在一起,还经常需要将一个数组拆分为多个子数组。例如:
• 将数据集划分为训练集与测试集
• 按列拆分特征
• 按批次分割数据
• 将大数组切分为若干块进行并行处理
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() 则分别对应列、行及第三轴方向的拆分操作。需要注意,不同函数在是否要求整除、拆分轴以及输入维度要求方面存在差异,在实际应用中应根据数据结构与任务需求合理选择。
“点赞有美意,赞赏是鼓励”
热门跟贴