NumPy排序的实现


Posted in Python onJanuary 21, 2020

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)]
Process finished with exit code 0

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('重构原数组')
for i in y:
  print(x[i],end=",")

运行结果:

返回从小到大的索引
[3 0 4 1 2]
以索引对原数组排序
[ 2  3  5  8 11]
重构原数组
2,3,5,8,11,
Process finished with exit code 0

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] for i in ind])

运行结果:

使用这个索引来获取排序后的数据:
['amar, f.y.', 'anil, s.y.', 'raju, f.y.', 'ravi, s.y.']

Process finished with exit code 0

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  9 13 23]

Process finished with exit code 0

实例:实现将数组中比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  9 10 12 13 23 27]
[ 0  1  2  6  5  3  7  9 10 12 23 13 27]

Process finished with exit code 0

注意:(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))

运行结果:

我们的数组是:
[[30 40  0]
 [ 0 20 10]
 [50  0 60]]

调用 nonzero() 函数:
(array([0, 0, 1, 1, 2, 2]), array([0, 1, 1, 2, 0, 2]))
Process finished with exit code 0

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),)
利用索引得到数组中的元素
[23 13 27]

Process finished with exit code 0

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])

运行结果:

[9 2 6]

Process finished with exit code 0

其它排序函数

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.j 2.-1.j 3.-3.j 3.-2.j 3.+5.j]

Process finished with exit code 0

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python Django使用forms来实现评论功能
Aug 17 Python
python snownlp情感分析简易demo(分享)
Jun 04 Python
使用Python的package机制如何简化utils包设计详解
Dec 11 Python
python实现聚类算法原理
Feb 12 Python
python中kmeans聚类实现代码
Feb 23 Python
pycharm修改界面主题颜色的方法
Jan 17 Python
PySide和PyQt加载ui文件的两种方法
Feb 27 Python
利用python实现AR教程
Nov 20 Python
Python实现图像去噪方式(中值去噪和均值去噪)
Dec 18 Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
Feb 26 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
Feb 29 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
May 09 Python
tensorflow实现在函数中用tf.Print输出中间值
Jan 21 #Python
Python实现随机生成任意数量车牌号
Jan 21 #Python
tensorflow模型继续训练 fineturn实例
Jan 21 #Python
tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例
Jan 21 #Python
tensorflow查看ckpt各节点名称实例
Jan 21 #Python
python同义词替换的实现(jieba分词)
Jan 21 #Python
tensorflow模型保存、加载之变量重命名实例
Jan 21 #Python
You might like
PHP学习之PHP表达式
2006/10/09 PHP
PHP下判断网址是否有效的代码
2011/10/08 PHP
destoon调用自定义模板及样式的公告栏
2014/06/21 PHP
PHP实现的堆排序算法详解
2017/08/17 PHP
JavaScript 应用类库代码
2008/06/02 Javascript
用正则表达式 动态创建/增加css style script 兼容IE firefox
2009/03/10 Javascript
javascript demo 基本技巧
2009/12/18 Javascript
JavaScript中的isXX系列是否继续使用的分析
2011/04/16 Javascript
jquery 插件学习(三)
2012/08/06 Javascript
js原生appendChild的bug解决心得分享
2013/07/01 Javascript
JS+CSS实现一个气泡提示框
2013/08/18 Javascript
javascript删除option选项的多种方法总结
2013/11/22 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
2014/04/14 Javascript
JavaScript中number转换成string介绍
2014/12/31 Javascript
jQuery实现点击按钮弹出可关闭层的浮动层插件
2015/09/19 Javascript
超精准的javascript验证身份证号的具体实现方法
2015/11/18 Javascript
JS小数运算出现多为小数问题的解决方法
2016/06/02 Javascript
教你JS中的运算符乘方、开方及变量格式转换
2016/08/09 Javascript
零基础之Node.js搭建API服务器的详解
2019/03/08 Javascript
vue中的双向数据绑定原理与常见操作技巧详解
2020/03/16 Javascript
详解React 元素渲染
2020/07/07 Javascript
[02:52]DOTA2新手基础教程 米波
2014/01/21 DOTA
python封装对象实现时间效果
2020/04/23 Python
跟老齐学Python之有容乃大的list(4)
2014/09/28 Python
跟老齐学Python之Python文档
2014/10/10 Python
Python编程中对文件和存储器的读写示例
2016/01/25 Python
对DJango视图(views)和模版(templates)的使用详解
2019/07/17 Python
django inspectdb 操作已有数据库数据的使用步骤
2021/02/07 Python
HTML5的表单(绝对特别强大的功能)使用示例
2013/06/20 HTML / CSS
RetroStage德国:复古服装
2019/02/03 全球购物
索桥的故事教学反思
2014/02/06 职场文书
小学教师读书活动总结
2014/07/08 职场文书
干部作风建设工作总结
2014/10/29 职场文书
2014年终个人总结报告
2015/03/09 职场文书
学习经验交流会演讲稿
2015/11/02 职场文书
公文写作指导之倡议书!
2019/07/03 职场文书