Numpy 数组的分割方法
在本文中,我们将介绍如何使用 NumPy 对数组进行分割,特别是根据元素的值对数组进行分割。NumPy 库是Python语言中用于科学计算的一个库,提供了一个便捷的数组对象,我们经常需要对其进行分割和操作,这也是本文要介绍的主要内容。
阅读更多:Numpy 教程
按值分割
我们需要将一个 NumPy 数组根据包含的元素值进行分割,可以依靠 np.split() 函数。
import numpy as np
a = np.array([2, 3, 4, 5, 6, 7, 8, 9])
b = np.array_split(a, 3)
print(b)
输出为:
[array([2, 3]), array([4, 5, 6]), array([7, 8, 9])]
这里我们将 a 数组分成了 3 个子数组,每个数组的元素数量相同(如果不能被等分,则最后一个数组会更少)。
如果我们想按值将数组分成更小的组,则需要指定索引的位置,如下例:
a = np.array([2, 3, 4, 5, 6, 7, 8, 9])
b = np.split(a, [3, 5, 7])
print(b)
输出为:
[array([2, 3, 4]), array([5, 6]), array([7, 8]), array([9])]
这里我们将 a 数组根据值将其分为 4 个子数组,索引的位置存在于列表 [3, 5, 7] 中。结果第一个子数组包含位置从 0 至 3 的元素,第二个子数组包含位置从 3 至 5 的元素,以此类推。
按条件分割
还有一种情况是我们可以设置条件,然后将数组分成两个或多个相同形状的数组。可以使用 np.split() 函数的关键字参数 axis 来控制。
a = np.array([2, 3, 4, 5, 6, 7, 8, 9])
b = np.split(a, [np.where(a > 5)[0][0]])
print(b)
输出为:
[array([2, 3, 4, 5]), array([6, 7, 8, 9])]
根据上面的代码,我们将 a 数组根据条件,分成了两个数组。在这个例子中,使用了 np.where() 函数,然后通过比较数组中的每个值,找到第一个大于 5 的元素,然后使用此元素的索引位置分割数组。这样,我们得到了两个数组,第一个数组包含位置从 0 至 3 的元素,第二个数组包含位置从 4 至 7 的元素。
以下是更复杂和更有趣的示例:
a = np.array([2, 3, 4, 5, 6, 7, 8, 9])
b = np.array(["Red", "Blue", "Red", "Yellow", "Black", "Red", "Green", "Green"])
print(np.unique(b))
c = np.split(a, np.where(b[:-1] != b[1:])[0] + 1)
print(c)
输出为:
['Black' 'Blue' 'Green' 'Red' 'Yellow']
[array([2, 3, 4, 5, 6]), array([7]), array([8, 9])]
在这个例子中,我们混合了数字数组和文本数组。我们使用了 np.unique() 函数来查找文本数组中唯一的字符串。然后使用切片和比较运算符比较 b 中元素的相邻元素,使用 np.where() 函数来查找一个数组不等于其相邻元素的位置,输出的结果为分割后的数组。在这个例子中,我们将 a 数组根据 b 数组的值分成了 3 个子数组。
水平分割
我们还可以按列将一个 NumPy 数组分割成相同形状的子数组。可以使用 np.hsplit() 函数。
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
b = np.hsplit(a, 3)
print(b)
输出为:
[array([[1],
[4],
[7]]), array([[2],
[5],
[8]]), array([[3],
[6],
[9]])]
这里我们将一个 3×3 的二维数组分成了三个 3×1 的子数组。我们可以使用切片来对列进行分割,np.hsplit() 函数将分割后的子数组存储在一个列表中。
垂直分割
我们还可以按行将一个 NumPy 数组分割成相同形状的子数组。可以使用 np.vsplit() 函数。
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
b = np.vsplit(a, 3)
print(b)
输出为:
[array([[1, 2, 3]]), array([[4, 5, 6]]), array([[7, 8, 9]])]
这里我们将一个 3×3 的二维数组分成了三个 1×3 的子数组。我们同样可以使用切片来对行进行分割,np.vsplit() 函数将分割后的子数组存储在一个列表中。
总结
本文介绍了 NumPy 数组的几种分割方法,包括按值分割、按条件分割、水平分割和垂直分割。这些方法可以帮助我们有效地对数组进行分割,提高我们的数据处理效率。
极客教程