NumPy排序的实现
numpy.sort()函数
该函数提供了多种排序功能,支持归并排序,堆排序,快速排序等多种排序算法
使用numpy.sort()方法的格式为:
numpy.sort(a,axis,kind,order)
- a:要排序的数组
- axis:沿着排序的轴,axis=0按照列排序,axis=1按照行排序。
- kind:排序所用的算法,默认使用快速排序。常用的排序方法还有
- quicksort:快速排序,速度最快,算法不具有稳定性
- mergesort:归并排序,优点是具有稳定性,空间复杂度较高,一般外部排序时才会考虑
- heapsort:堆排序,优点是堆排序在最坏的情况下,其时间复杂度也为O(nlogn),是一个既最高效率又最节省空间的排序方法
- order:如果包含字段,则表示要排序的字段(比如按照数组中的某个元素项进行排序)
下面通过一个实例来具体了解numpy.sort()函数的用法
假设我们有一组用户信息,包含用户的用户名以及用户的年龄,我们按照用户的年龄来进行排序
dt=np.dtype([('name','S20'),('age','i4')]) a=np.array([('adm','19'),('wan','23'),('ade','23')],dtype=dt) s=np.sort(a,order='age',kind='quicksort') print(s)
运行结果:
[(b'adm',19)(b'ade',23)(b'wan',23)]
Processfinishedwithexitcode0
numpy.argsort()函数
numpy.argsort()函数返回的时从小到大的元素的索引
可以通过以下的实例更好的理解
使用argsort()方法返回索引并重构数组
x=np.array([3,8,11,2,5]) print('返回从小到大的索引') y=np.argsort(x) print(y) print('以索引对原数组排序') print(x[y]) print('重构原数组') foriiny: print(x[i],end=",")
运行结果:
返回从小到大的索引
[30412]
以索引对原数组排序
[2 3 5 811]
重构原数组
2,3,5,8,11,
Processfinishedwithexitcode0
numpy.lexsort()函数
numpy.sort()函数可对于多个序列进行排序,例如我们在比较成绩的时候先比较总成绩,由后列到前列的优先顺序进行比较,这时就用到了lexsort()方法
nm=('raju','anil','ravi','amar') dv=('f.y.','s.y.','s.y.','f.y.') ind=np.lexsort((dv,nm)) print('调用lexsort()函数:') print(ind) print('\n') print('使用这个索引来获取排序后的数据:') print([nm[i]+","+dv[i]foriinind])
运行结果:
使用这个索引来获取排序后的数据:
['amar,f.y.','anil,s.y.','raju,f.y.','ravi,s.y.']Processfinishedwithexitcode0
numpy.partition()函数
numpy.partition()叫做分区排序,可以制定一个数来对数组进行分区。
格式如下:
partition(a,kth[,axis,kind,order])
实例:实现将数组中比7小的元素放到前面,比7大的放后面
#partition分区排序 a=np.array([2,3,9,1,0,7,23,13]) print(np.partition(a,7))
运行结果:
[0 1 2 3 7 91323]
Processfinishedwithexitcode0
实例:实现将数组中比7小的元素放到前面,比10大的放后面,7-10之间的元素放中间
partition分区排序
a=np.array([2,3,9,1,6,5,0,12,10,7,23,13,27]) print(np.partition(a,(7,10))) print(np.partition(a,(2,7)))
运行结果
[1 0 2 3 5 6 7 91012132327]
[0 1 2 6 5 3 7 91012231327]Processfinishedwithexitcode0
注意:(7,10)中10的位置,数值不能超过数组长度。
numpy.nonzero()函数
返回输入数组中非零元素的索引
a=np.array([[30,40,0],[0,20,10],[50,0,60]]) print('我们的数组是:') print(a) print('\n') print('调用nonzero()函数:') print(np.nonzero(a))
运行结果:
我们的数组是:
[[3040 0]
[02010]
[50 060]]
调用nonzero()函数:
(array([0,0,1,1,2,2]),array([0,1,1,2,0,2]))
Processfinishedwithexitcode0
numpy.where()函数
返回满足输入条件的索引
where()函数的使用 b=np.array([2,1,3,0,4,7,23,13,27]) y=np.where(b>10) print(y) print('利用索引得到数组中的元素') print(b[y])
运行结果:
(array([6,7,8],dtype=int64),)
利用索引得到数组中的元素
[231327]Processfinishedwithexitcode0
numpy.extract()函数
numpy.extract()函数实现的是返回自定义条件的元素
#extract()自定义元素筛选 b=np.array([2,1,3,0,4,7,23,13,27]) con=np.mod(b,2)==0 y=np.extract(con,b) print(a[y])
运行结果:
[926]
Processfinishedwithexitcode0
其它排序函数
numpy.argmax()和numpy.argmin()函数分别沿给定轴返回最大和最小元素的索引。numpy.sort_complex(a)函数实现对复数按照先实部后虚部的顺序进行排序。numpy.argpartition(a,kth[,axis,kind,order])函数实现通过指定关键字沿着指定的轴对数组进行分区。
下面举一个复数排序的例子:
t=np.array([1.+2.j,2.-1.j,3.-3.j,3.-2.j,3.+5.j]) res=np.sort_complex([1+2j,2-1j,3-2j,3-3j,3+5j]) print(res)
运行结果:
[1.+2.j2.-1.j3.-3.j3.-2.j3.+5.j]
Processfinishedwithexitcode0
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。