赞
踩
这个方法是对输入的array进行一个排序,返回一个新的array,但这个array中的元素对应的是每个元素的在原数组中的索引位置
x= np. array([3,1,2])
np.argsort(x)
>>> array([1,2,0])
可以见这个函数默认是升序排列
如果是多维数组,那么可以修改axis关键字
x = np.array([ [0,3],[2,2] ])
>>>x
> array([[0,3],
> [2,2]
> ]
>>>np.argsort(x,axis = 0)
> array([[0,1],
> [1,0]
> ])
如果要从高到低排序,可以这么使用
np.argsort( -x )
这个方法是python内置的方法,可以从可迭代对象中返回一个新的排序好的列表
原型
sorted(iterable[,cmp,[,key[,reverse=True]]])
参数:
cmp: 指定一个定制的比较函数,这个函数接受两个参数(可迭代对象的元素),如果第一个参数小于第二个参数,返回一个负数;如果第一个参数等于第二个参数,返回零;如果第一个参数大于第二个参数,返回一个整数,默认值为None。
key : 指定一个接受一个参数的函数,这个函数用于从每个元素中提取一个用于比较的关键字。默认值为None(应该是元素本身)
reverse: 是一个布尔值。如果设置为True,列表元素,将被倒序排列。
简单用法
>>>sorted([5,4,3,2,1])
>[1,2,3,4,5]
用list.sort()的方法,效率会更高一些,因为是原地排序,但是指针对list有用,不如sorted方便
sorted({1:'D',2:'B',3:'B',4:"E",5:'A'}) [1,2,3,4,5]
这返回的是一个键值组成的列表,默认是用字典键值作为关键字来排序的
有时候可以自己指定关键字,如
>>>sorted("This is a test string from Andrew".split(), key=str.lower)
>['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
比较的关键字就是str.lower,不分大小写进行比较
对于复杂的对象的比较同上是使用对象的切片作为关键字。为
>>>student_tuples = [ ('john','A',15),( 'jane','B',12 ),('dave','B',10) ]
>>>sorted( student_tuples, key = lambda student: student[2] )
>[('dave','B',10),( 'jane','B',12 ),('john','A',15)]
上面就是用年龄来作为排序的关键字
利用operator的itemgetter与attrgetter函数来进行排序
使用key关键字自定义比较函数的方法很常见,所以operator module提供了itemgetter以及attrgetter的方法来进行,比较关键字的指定
from operator import itemgetter,attrgetter
sorted( student_tuples,key = itemgetter(2) ) [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
即在可迭代对象元素中第二的位置的值,作为比较的key值。
如果元素是一个有多个属性的,对象,也可以用attrgetter来指定用来比较的对象名
sorted(student_objects,key = attrgetter('age')
operator模块还支持多级排序,比如先按成绩,后按年龄
sorted(student_tuples, key=itemgetter(1,2)) [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
sorted(student_objects, key=attrgetter('grade', 'age')) [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
在机器学习实战上有这样一段代码
sortedClassCount = sorted( classCount.iteritems(),key = itemgetter(1),reverse = True )
classcount是一个字典,iteritems(中)会把键值对,转化为元组的形式如 (‘B’,15),形成一个原组列表,那么之后的key=itemgetter(1)意义就是用后面的投票值进行降序排序。
在3.0中没有iteritems这个成员函数,但有items函数,可以将字典转换为一个,可以迭代对象
>> mat.items()
>>dict_items([(1, 2), (3, 4)])
初步感觉,如果使用itemgetter与attrgetter遇到有多个属性的对象,可以建立起多重优先级的复杂排序
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。