NumPy - 排序、搜索和计数函数
NumPy 提供了多种用于对数组中的元素进行排序、搜索和计数的函数。这些函数对于数据操作和分析非常有用。
NumPy 提供了多种排序算法,每种算法都有其特点。以下是三种常见排序算法的比较 -
种类 | 速度 | 最坏情况 | 工作空间 | 稳定 |
---|---|---|---|---|
'quicksort' | 1 | O(n^2) | 0 | no |
'mergesort' | 2 | O(n*log(n)) | ~n/2 | yes |
'heapsort' | 3 | O(n*log(n)) | 0 | no |
numpy.sort() 函数
sort() 函数返回输入数组的排序副本。它可以沿任何指定的轴对数组进行排序,并支持不同的排序算法。语法如下:
numpy.sort(a, axis, kind, order)
其中,
序号 | 参数 &描述 |
---|---|
1 |
a 待排序的数组 |
2 |
axis 数组要沿其排序的轴。如果没有,则数组将被展平,并按最后一个轴排序。 |
3 |
kind 默认为快速排序 |
4 |
order 如果数组包含字段,则指定要排序的字段顺序。 |
示例
在下面的示例中,我们将按默认方式和特定轴对二维 NumPy 数组进行排序。我们还演示了如何按特定字段(例如"name")对结构化数组进行排序 -
import numpy as np # 创建二维数组 a = np.array([[3, 7], [9, 1]]) print("我们的数组是:",a) # 默认排序 print("调用 sort() 函数:",np.sort(a)) # 沿轴 0 排序 print("沿轴 0 排序:",np.sort(a, axis=0)) # sort 函数中的 order 参数 dt = np.dtype([('name', 'S10'), ('age', int)]) a = np.array([("raju", 21), ("anil", 25), ("ravi", 17), ("amar", 27)], dtype=dt) print("我们的数组是:",a) print("按名称排序:",np.sort(a, order='name'))
它将产生以下输出 -
我们的数组是: [[3 7] [9 1]] 调用 sort() 函数: [[3 7] [1 9]] 沿轴 0 排序: [[3 1] [9 7]] 我们的数组是: [('raju', 21) ('anil', 25) ('ravi', 17) ('amar', 27)] 按名称排序: [('amar', 27) ('anil', 25) ('raju', 21) ('ravi', 17)]
numpy.argsort() 函数
numpy.argsort() 函数对输入数组进行间接排序,沿给定轴并使用指定的排序类型返回数据索引数组。此索引数组用于构造排序后的数组。
示例
在此示例中,我们使用 argsort() 函数检索索引,即已排序元素在原始数组中的位置。使用这些索引,你可以重建已排序的数组 -
import numpy as np # 创建数组 x = np.array([3, 1, 2]) print("我们的数组是:",x) # 获取对数组进行排序的索引 y = np.argsort(x) print("对 x 应用 argsort():",y) # 使用索引重建已排序的数组 print("按排序顺序重建原始数组:",x[y]) # 使用循环重建原始数组 print("使用循环重建原始数组:") for i in y: print(x[i], end=' ')
它将产生以下输出 -
我们的数组是: [3 1 2] 对 x 应用 argsort(): [1 2 0] 按排序顺序重建原始数组: [1 2 3] 使用循环重建原始数组: 1 2 3
numpy.lexsort() 函数
NumPy lexsort() 函数使用一系列键执行间接排序。这些键可以看作电子表格中的一列。该函数返回一个索引数组,使用该数组可以获取排序后的数据。注意,最后一个键恰好是 sort 的主键。
示例
在此示例中,我们使用 np.lexsort() 函数基于多个键对数据集进行排序,其中最后一个键"nm"是主要排序条件。然后,使用排序后的索引,通过组合名称和相应字段来显示排序后的数据 -
import numpy as np # 定义键 nm = ('raju', 'anil', 'ravi', 'amar') dv = ('f.y.', 's.y.', 's.y.', 'f.y.') # 获取排序后的索引 ind = np.lexsort((dv, nm)) print("调用 lexsort() 函数:",ind) # 使用索引获取排序后的数据 print("使用此索引获取排序后的数据:",[nm[i] + ", " + dv[i] for i in ind])
将产生以下输出−
应用 lexsort() 函数: [3 1 0 2] 使用此索引获取已排序数据: ['amar, f.y.', 'anil, s.y.', 'raju, f.y.', 'ravi, s.y.']
NumPy 提供了查找最大值、最小值和非零元素以及满足条件的元素的索引的函数。
numpy.argmax() 和 numpy.argmin() 函数
NumPy argmax() 和 argmin() 函数分别返回沿给定轴的最大和最小元素的索引。
示例
在此示例中,我们使用 np.argmax() 和 np.argmin() 函数来查找二维数组中最大值和最小值的索引,包括扁平数组和特定轴上的索引 -
import numpy as np # 创建二维数组 a = np.array([[30, 40, 70], [80, 20, 10], [50, 90, 60]]) print("我们的数组是:",a) # 调用 argmax() 函数 print("调用 argmax() 函数:",np.argmax(a)) # 展平数组中最大值的索引 print("展平数组中最大值的索引:",a.flatten()) # 包含沿轴 0 最大值的索引的数组 print("包含沿轴 0 最大值的索引的数组:") maxindex = np.argmax(a, axis=0) print(maxindex) # 包含沿轴 1 最大值的索引的数组 print("包含沿轴 1 最大值的索引的数组:") maxindex = np.argmax(a, axis=1) print(maxindex) # 调用 argmin() 函数 print("调用 argmin() 函数:") minindex = np.argmin(a) print(minindex) # 展平数组 print("展平数组:",a.flatten()[minindex]) # 沿轴 0 展平数组 print("沿轴 0 展平数组:") minindex = np.argmin(a, axis=0) print(minindex) # 沿轴 1 展平数组 print("沿轴 1 展平数组:") minindex = np.argmin(a, axis=1) print(minindex)
输出包含这些极值的索引,演示如何访问和解释数组中的这些位置 -
我们的数组是: [[30 40 70] [80 20 10] [50 90 60]] 调用 argmax() 函数: 7 展平数组中最大值的索引 [30 40 70 80 20 10 50 90 60] 包含沿轴 0 最大值索引的数组: [1 2 0] 包含沿轴 1 最大值索引的数组: [2 0 1] 调用 argmin() 函数: 5 展平数组: 10 沿轴 0 展平数组: [0 1 1] 沿轴 1 展平数组: [0 2 0]
numpy.nonzero() 函数
numpy.nonzero() 函数返回输入数组中非零元素的索引。
示例
在下面的示例中,我们使用 nonzero() 函数检索数组"a"中非零元素的索引 -
import numpy as np a = np.array([[30,40,0],[0,20,10],[50,0,60]]) print ('我们的数组是:',a) print ('应用 nonzero() 函数:',np.nonzero (a))
它将产生以下输出 -
我们的数组是: [[30 40 0] [ 0 20 10] [50 0 60]] 调用 nonzero() 函数: (array([0, 0, 1, 1, 2, 2]), array([0, 1, 1, 2, 0, 2]))
numpy.where() 函数
where() 函数返回输入数组中满足给定条件的元素的索引,如下例所示 -
import numpy as np x = np.arange(9.).reshape(3, 3) print ('我们的数组是:',x) print ('元素的索引 > 3') y = np.where(x > 3) print (y) print ('使用这些索引获取满足条件的元素',x[y])
它将产生以下输出 -
我们的数组是: [[ 0. 1. 2.] [ 3. 4. 5.] [ 6. 7. 8.]] 元素的索引 > 3 (array([1, 1, 2, 2, 2]), array([1, 2, 0, 1, 2])) 使用这些索引获取满足条件的元素 [ 4. 5. 6. 7. 8.]
numpy.extract() 函数
extract() 函数返回满足以下示例所示任何条件的元素 -
import numpy as np x = np.arange(9.).reshape(3, 3) print ('我们的数组是:',x) # 定义一个条件 condition = np.mod(x,2) == 0 print ('条件的逐元素值',condition) print ('使用条件提取元素',np.extract(condition, x))
它将产生以下输出 −
我们的数组是: [[ 0. 1. 2.] [ 3. 4. 5.] [ 6. 7. 8.]] 条件的元素值 [[ True False True] [False True False] [ True False True]] 使用条件提取元素 [ 0. 2. 4. 6. 8.]