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 条件判断的缩写方法
Sep 06 Python
python 生成不重复的随机数的代码
May 15 Python
python中类变量与成员变量的使用注意点总结
Apr 29 Python
Python AES加密模块用法分析
May 22 Python
Python实现正弦信号的时域波形和频谱图示例【基于matplotlib】
May 04 Python
python 简单照相机调用系统摄像头实现方法 pygame
Aug 03 Python
Python解决两个整数相除只得到整数部分的实例
Nov 10 Python
Python实现朴素贝叶斯的学习与分类过程解析
Aug 24 Python
python用requests实现http请求代码实例
Oct 31 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
Jan 05 Python
Python 抓取数据存储到Redis中的操作
Jul 16 Python
paramiko使用tail实时获取服务器的日志输出详解
Dec 06 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
使用网络地址转换实现多服务器负载均衡
2006/10/09 PHP
Symfony2实现在doctrine中内置数据的方法
2016/02/05 PHP
解决Yii2邮件发送结果返回成功,但接收不到邮件的问题
2017/05/23 PHP
基于jQuery的仿flash的广告轮播代码
2010/11/04 Javascript
jquery 如何动态添加、删除class样式方法介绍
2012/11/07 Javascript
jquery实现点击TreeView文本父节点展开/折叠子节点
2013/01/10 Javascript
JavaScript基础知识学习笔记
2014/12/02 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
javascript实现的闭包简单实例
2015/07/17 Javascript
基于jQuery实现动态数字展示效果
2015/08/12 Javascript
javascript多物体运动实现方法分析
2016/01/08 Javascript
深入理解JavaScript中为什么string可以拥有方法
2016/05/24 Javascript
Seajs是什么及sea.js 由来,特点以及优势
2016/10/13 Javascript
JS实现的几个常用算法
2016/11/12 Javascript
Angular.js自定义指令学习笔记实例
2017/02/24 Javascript
详解webpack的配置文件entry与output
2017/08/21 Javascript
js实现加载页面就自动触发超链接的示例
2017/08/31 Javascript
JS中利用FileReader实现上传图片前本地预览功能
2018/03/02 Javascript
基于vue通用表单解决方案的思考与分析
2019/03/16 Javascript
Vue 开发必须知道的36个技巧(小结)
2019/10/09 Javascript
js实现简单贪吃蛇游戏
2020/05/15 Javascript
解决vue 退出动画无效的问题
2020/08/09 Javascript
Python编写的com组件发生R6034错误的原因与解决办法
2013/04/01 Python
Python中几个比较常见的名词解释
2015/07/04 Python
Python面向对象编程基础实例分析
2020/01/17 Python
adidas泰国官网:adidas TH
2020/07/11 全球购物
行政文员岗位职责
2013/11/08 职场文书
优秀老员工获奖感言
2014/02/15 职场文书
违反校纪校规检讨书
2014/02/15 职场文书
战友聚会主持词
2014/04/02 职场文书
小学生新年寄语
2014/04/03 职场文书
留守儿童工作方案
2014/06/02 职场文书
2014年创卫工作总结
2014/11/24 职场文书
2015年教师节演讲稿范文
2015/03/19 职场文书
公务员保密工作承诺书
2015/05/04 职场文书
钱学森电影观后感
2015/06/04 职场文书