在 NumPy 中,如果想要对一个数组进行分割,常用的有 4 个函数(如下表所示)。
| 函数 | 说明 |
|---|---|
| split() | 通用数组分割,可指定轴向 |
| hsplit() | 水平分割(沿列方向,等价于 axis = 1) |
| vsplit() | 垂直分割(沿行方向,等价于 axis = 0) |
| array_split() | 支持非均匀分割的增强版本 |
numpy.split()
在 NumPy 中,我们可以使用 split() 函数将数组分割成多个子数组。
语法:
numpy.split(arr, indices_or_sections, axis=0)说明:
split() 函数接收以下 3 个参数。
arr(必选):是一个数组。indices_or_sections(必选):是整数或一维数组。- 如果是整数,表示将数组分割成多少个子数组(数组长度须能被整除)。
- 如果是一维数组,表示按指定分割位置分割数组(允许非均匀分割)。
axis(可选,默认:0):指定分割的轴。默认为 0,即纵向分割。
示例 1:均匀分割一维数组
import numpy as np
arr = np.arange(6)
result = np.split(arr, 3)
print(arr)
print(result)
print(type(result))运行结果如下。
[0 1 2 3 4 5]
[array([0, 1]), array([2, 3]), array([4, 5])]
<class 'list'>分析:
np.split(arr, 3) 表示将 arr 平均分割成 3 个数组。split() 函数会返回一个列表,该列表每一个元素都是一个数组。
示例 2:按指定位置分割一维数组
import numpy as np
arr = np.array([10, 20, 30, 40, 50, 60, 70, 80, 90])
result = np.split(arr, [2, 5]) # 在第2、5索引处分割
print(result)运行结果如下。
[array([10, 20]), array([30, 40, 50]), array([60, 70, 80, 90])]分析:
np.split(arr, [2, 5]) 表示将数组划分为 [0:2)、[2:5)、[5:8) 这 3 个区间。从结果可以看出,split() 函数支持非连续分割。
示例 3:分割二维数组
import numpy as np
arr = np.arange(8).reshape(4, 2)
result1 = np.split(arr, 2, axis=0)
result2 = np.split(arr, 2, axis=1)
print(arr)
print(result1)
print(result2)运行结果如下。
[[0 1]
[2 3]
[4 5]
[6 7]]
[array([[0, 1], [2, 3]]), array([[4, 5], [6, 7]])]
[array([[0], [2], [4], [6]]), array([[1], [3], [5], [7]])]分析:
当 axis=0 时,split() 表示沿着 “纵轴” 分割,也就是在垂直方向上分割。下面 2 种方式是等价的。
# 方式 1
np.split(arr, 2, axis=0)
# 方式 2
np.vsplit(arr, 2)当 axis=1 时,split() 表示沿着 “横轴” 分割,也就是在水平方向上分割。下面 2 种方式是等价的。
# 方式 1
np.split(arr, 2, axis=1)
# 方式 2
np.hsplit(arr, 2)numpy.hsplit()
在 NumPy 中,我们可以使用 hsplit() 函数将数组水平(按列)分割成多个子数组。
语法:
numpy.hsplit(arr, indices_or_sections)说明:
hsplit() 函数接收以下 2 个参数。
arr(必选):是一个数组。indices_or_sections(必选):如果是一个整数,则表示将数组分割成多少个子数组;如果是一个一维数组,则表示在哪些位置分割数组。
提示: hsplit() 等价于 split(axis=1),它是专门用于水平方向分割。
示例 4:多列非均匀分割
import numpy as np
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
result = np.hsplit(arr, [1, 3]) # 在第1、3列处分割
print(result)运行结果如下。
[array([[1],
[5]]), array([[2, 3],
[6, 7]]), array([[4],
[8]])]分析:
np.hsplit(arr, [1, 3]) 表示在第 1、3 列处进行分割,此时会将 4 列数组分割为 1 列、2 列、1 列三个子数组。
numpy.vsplit()
在 NumPy 中,我们可以使用 vsplit() 函数将数组垂直(按行)分割成多个子数组。
语法:
numpy.vsplit(arr, indices_or_sections)说明:
vsplit() 函数接收以下 2 个参数。
arr(必选):是一个数组。indices_or_sections(必选):如果是一个整数,则表示将数组分割成多少个子数组;如果是一个一维数组,则表示在哪些位置分割数组。
提示: vsplit() 等价于 split(axis=0),它是专门用于垂直方向分割。
示例 5:numpy.vsplit() 基本用法
import numpy as np
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
result = np.vsplit(arr, 2)
print(result)运行结果如下。
[array([[1, 2, 3, 4]]), array([[5, 6, 7, 8]])]分析:
np.hsplit(arr, 2) 表示将数组 arr 垂直分割成了 2 个子数组。
示例 6:numpy.vsplit() 分割三维数组
import numpy as np
arr = np.arange(24).reshape(6, 2, 2)
result = np.vsplit(arr, [2, 4])
print([x.shape for x in result])运行结果如下。
[(2, 2, 2), (2, 2, 2), (2, 2, 2)]分析:
np.vsplit(arr, [2, 4]) 表示将 arr(这是一个三维数组)沿着垂直方向(轴 0)在索引 2 和 4 的位置进行分割,从而得到 3 个形状为 (2, 2, 2) 的子数组。
numpy.array_split()
在 NumPy 中,我们可以使用 array_split() 函数来将数组分割成指定数量的子数组。与 split()、hsplit() 和 vsplit() 等函数不同的是,array_split() 函数允许分割后的子数组形状不完全相同,即支持非均匀分割。
语法:
numpy.array_split(arr, indices_or_sections, axis=0)说明:
array_split() 函数接收以下 3 个参数。
arr(必选):是一个数组。indices_or_sections(必选):是一个整数,表示将数组分割成多少个子数组。axis(可选,默认:0):指定分割的轴。默认为 0,即纵向分割。
示例 7:非均匀分割一维数组
import numpy as np
arr = np.arange(7)
result = np.array_split(arr, 3)
print(arr)
print(result)运行结果如下。
[0 1 2 3 4 5 6]
[array([0, 1, 2]), array([3, 4]), array([5, 6])]分析:
np.array_split(arr, 3) 表示尝试将包含 7 个元素的一维数组分割成 3 个子数组。由于 7 不能被 3 整除,因此分割后的子数组的长度分别为 3、2 和 2。
