Numpy中的排序(sort,argsort)

按索引排序

>>import numpy as np
>>x=np.array([[0,12,48],[4,14,18],[1,7,99]])
#灵活应用索引和切片实现按索引的排序

#倒序的实现(普通列表也可用reverse实现,numpy则没有这个方法)
>>x[::-1]
array([[ 1,  7, 99],
       [ 4, 14, 18],
       [ 0, 12, 48]])

#指定顺序的实现(传入用于指定顺序的整数列表或ndarray即可)
>>x[[2,0,1]]
array([[ 1,  7, 99],
       [ 0, 12, 48],
       [ 4, 14, 18]])

>>x[[2,0,1],[0,2,1]] #只是截取部分元素,并不符合排序要求
array([ 1, 48, 14])

>>x[[2,0,1]][:,[0,2,1]]
array([[ 1, 99,  7],
       [ 0, 48, 12],
       [ 4, 18, 14]])

>>x[np.ix_([2,0,1],[0,2,1])] #np.ix_函数将两个一维数组转化为用于选取方形区域的索引器
array([[ 1, 99,  7],
       [ 0, 48, 12],
       [ 4, 18, 14]])

按值大小排序

ndarray.sort(axis=-1, kind='quicksort', order=None)
或者:ndarray.sort(axis=-1, kind='quicksort', order=None)

参数描述
axis排序沿数组的(轴)方向,0表示按行,1表示按列,None表示展开来排序,默认值为-1,表示沿最后的轴排序
kind排序的算法,提供了快排'quicksort'、混排'mergesort'、堆排'heapsort', 默认为‘quicksort'
order排序的字段名,可指定字段排序,默认为None
>>import numpy as np
>>x=np.array([[0,12,48],[4,18,14],[7,1,99]])

>>np.sort(x)
array([[ 0, 12, 48],
       [ 4, 14, 18],
       [ 1,  7, 99]])

>>np.sort(x,axis=1)
array([[ 0, 12, 48],
       [ 4, 14, 18],
       [ 1,  7, 99]])

>>x.sort()
array([[ 0, 12, 48],
       [ 4, 14, 18],
       [ 1,  7, 99]])

>>dt = np.dtype([('name',  'S10'),('age',  int)]) 
>>a = np.array([("Mike",21),("Nancy",25),("Bob",  17),  ("Jane",27)], dtype = dt)
>>np.sort(a, order =  'name')
array([(b'Bob', 17), (b'Jane', 27), (b'Mike', 21), (b'Nancy', 25)],
      dtype=[('name', 'S10'), ('age', '<i4')])

>>np.sort(a, order =  'age')
array([(b'Bob', 17), (b'Mike', 21), (b'Nancy', 25), (b'Jane', 27)],
      dtype=[('name', 'S10'), ('age', '<i4')])

numpy.argsort(a, axis=-1, kind='quicksort', order=None)
对数组沿给定轴执行间接排序,并使用指定排序类型返回数据的索引数组。 这个索引数组用于构造排序后的数组。

参数类似于sort(),不作说明

>>import numpy as np

>>> x = np.array([3, 1, 2])
>>> a=np.argsort(x)
>>a #升序
#argsort函数返回的是数组值从小到大的索引值,[3, 1, 2]从小到大为[1,2,3],期对应的索引为[1,2,0] 
array([1, 2, 0]) 

>>np.argsort(-x) #降序
array([0, 2, 1], dtype=int64)

>>x[a] #以排序后的顺序重构原数组
array([1, 2, 3])

#二维数组
>>x=np.array([[0,12,48],[4,18,14],[7,1,99]])
>>a1=np.argsort(x)
>>a1
array([[0, 1, 2],
       [0, 2, 1],
       [1, 0, 2]], dtype=int64)
#以排序后的顺序重构原数组,注意与一维数组的形式不一样
>>np.array([np.take(x[i],x[i].argsort())for i in range(3)])
array([[ 0, 12, 48],
       [ 4, 14, 18],
       [ 1,  7, 99]])

>>x[x[:,2].argsort()] #按照第三列对行进行排序
array([[ 4, 18, 14],
       [ 0, 12, 48],
       [ 7,  1, 99]])

>>x.T[x.T[:,2].argsort()].T #按照第三行对列进行排序
array([[12,  0, 48],
       [18,  4, 14],
       [ 1,  7, 99]])

>>x[:,x[2].argsort()]  #还可以这样写
array([[12,  0, 48],
       [18,  4, 14],
       [ 1,  7, 99]])

lexsort(keys, axis=-1)
lexsort()根据键值的字典序进行排序,支持对数组按指定行或列的顺序排序,间接排序,不修改原数组,返回索引。一般对一维数组使用argsort()。
默认按最后一行元素有小到大排序, 返回最后一行元素排序后索引所在位置。

参数描述
'axis'数组排序时的基准,axis=0,按行排列;axis=1,按列排列
'keys'排序的参照物包括数组或包含N维的的元组,默认值为最后一行,(如果为二维数组则指最后一列)
>>import numpy as np 
>>x=np.array([[0,12,48],[4,18,14],[7,1,99]])

>>np.lexsort(x)
array([1, 0, 2], dtype=int64) #返回索引值

>>a=np.array([1,5,1,4,3,4,4])
>>b=np.array([9,4,0,4,0,2,1])
>>> ind=np.lexsort((b,a)) 
>>ind #将长度相同的a,b组合,再根据a值的大小进行排序,再考虑b值
array([2, 0, 4, 6, 5, 3, 1], dtype=int64) 

>>list(zip(a[ind],b[ind]))
[(1, 0), (1, 9), (3, 0), (4, 1), (4, 2), (4, 4), (5, 4)]

>>> c=[[1,5,1,4,3,4,4],[9,4,0,4,0,2,1]]
>>> np.lexsort(c) # 此种情况与先b后a的情况一致
array([2, 4, 6, 5, 3, 1, 0], dtype=int64)

#其他方法
#按最后一列顺序排序
>>x[np.lexsort(x.T)]
array([[ 4, 18, 14],
       [ 0, 12, 48],
       [ 7,  1, 99]])

#按最后一列逆序排序
>>x[np.lexsort(-x.T)] 
array([[ 7,  1, 99],
       [ 0, 12, 48],
       [ 4, 18, 14]])

#按第一列顺序排序
>>x[np.lexsort(x[:,::-1].T)]
array([[ 0, 12, 48],
       [ 4, 18, 14],
       [ 7,  1, 99]])

#按最后一行顺序排序
>>x.T[np.lexsort(x)].T 
array([[12,  0, 48],
       [18,  4, 14],
       [ 1,  7, 99]])

#按第一行顺序排序
>>x.T[np.lexsort(x[::-1,:])].T 
array([[ 0, 12, 48],
       [ 4, 18, 14],
       [ 7,  1, 99]])
  • 17
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NumPy,数组有三个常用的排序方法:`sort`、`argsort`和`lexsort`。 - `sort`: 对数组进行排序,可以指定排序的轴; - `argsort`: 返回数组排序后的索引,可以指定排序的轴; - `lexsort`: 对多个序列进行排序,返回排序后的索引。 具体来说,它们的含义如下: - `sort`: 该方法用于对数组进行排序,它可以接收一个可选参数`axis`,用于指定排序的轴。默认情况下,`axis=None`,表示对整个数组进行排序。该方法会返回排序后的数组,原数组不会被改变。 - `argsort`: 该方法返回数组排序后的索引。它可以接收一个可选参数`axis`,用于指定排序的轴。默认情况下,`axis=-1`,表示对最后一个轴进行排序。该方法会返回一个数组,数组的每个元素是原数组对应位置的值在排序后的数组的索引。例如,对一个一维数组进行排序,可以使用以下代码: ```python import numpy as np a = np.array([3, 1, 4, 1, 5, 9, 2, 6]) print(np.argsort(a)) # 输出结果为 [1 3 6 0 2 4 7 5] ``` - `lexsort`: 该方法用于对多个序列进行排序。它接收一个元组作为参数,元组的每个元素都是需要排序的序列。排序时,先按最后一个序列排序,然后按倒数第二个序列排序,以此类推。该方法返回排序后的索引。例如,对两个一维数组`a`和`b`进行排序,可以使用以下代码: ```python import numpy as np a = np.array([3, 1, 4, 1, 5, 9, 2, 6]) b = np.array([1, 2, 3, 4, 5, 6, 7, 8]) idx = np.lexsort((a, b)) print(idx) # 输出结果为 [1 3 6 0 2 4 7 5] ``` 在这个例子,先按`b`数组排序,再按`a`数组排序,得到的结果与`argsort`方法的结果相同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值