NumPy 数组分割

在 NumPy 中,如果想要对一个数组进行分割,常用的有 4 个函数(如下表所示)。

NumPy 分割数组的函数
函数 说明
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。

上一篇: NumPy 数组切片

下一篇: NumPy 数组合并

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号