numpy narray数据结构的一些常用方法--argsort,sort, 以及内置的sorted方法

numpy.argsort

这个方法是对输入的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 )

sorted

这个方法是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遇到有多个属性的对象,可以建立起多重优先级的复杂排序

猜你喜欢

转载自blog.csdn.net/ronaldo_hu/article/details/51240745