当前位置:   article > 正文

Numpy中的排序(sort,argsort)_numpyargsort倒序

numpyargsort倒序

按索引排序

  1. >>import numpy as np
  2. >>x=np.array([[0,12,48],[4,14,18],[1,7,99]])
  3. #灵活应用索引和切片实现按索引的排序
  4. #倒序的实现(普通列表也可用reverse实现,numpy则没有这个方法)
  5. >>x[::-1]
  6. array([[ 1, 7, 99],
  7. [ 4, 14, 18],
  8. [ 0, 12, 48]])
  9. #指定顺序的实现(传入用于指定顺序的整数列表或ndarray即可)
  10. >>x[[2,0,1]]
  11. array([[ 1, 7, 99],
  12. [ 0, 12, 48],
  13. [ 4, 14, 18]])
  14. >>x[[2,0,1],[0,2,1]] #只是截取部分元素,并不符合排序要求
  15. array([ 1, 48, 14])
  16. >>x[[2,0,1]][:,[0,2,1]]
  17. array([[ 1, 99, 7],
  18. [ 0, 48, 12],
  19. [ 4, 18, 14]])
  20. >>x[np.ix_([2,0,1],[0,2,1])] #np.ix_函数将两个一维数组转化为用于选取方形区域的索引器
  21. array([[ 1, 99, 7],
  22. [ 0, 48, 12],
  23. [ 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
  1. >>import numpy as np
  2. >>x=np.array([[0,12,48],[4,18,14],[7,1,99]])
  3. >>np.sort(x)
  4. array([[ 0, 12, 48],
  5. [ 4, 14, 18],
  6. [ 1, 7, 99]])
  7. >>np.sort(x,axis=1)
  8. array([[ 0, 12, 48],
  9. [ 4, 14, 18],
  10. [ 1, 7, 99]])
  11. >>x.sort()
  12. array([[ 0, 12, 48],
  13. [ 4, 14, 18],
  14. [ 1, 7, 99]])
  15. >>dt = np.dtype([('name', 'S10'),('age', int)])
  16. >>a = np.array([("Mike",21),("Nancy",25),("Bob", 17), ("Jane",27)], dtype = dt)
  17. >>np.sort(a, order = 'name')
  18. array([(b'Bob', 17), (b'Jane', 27), (b'Mike', 21), (b'Nancy', 25)],
  19. dtype=[('name', 'S10'), ('age', '<i4')])
  20. >>np.sort(a, order = 'age')
  21. array([(b'Bob', 17), (b'Mike', 21), (b'Nancy', 25), (b'Jane', 27)],
  22. dtype=[('name', 'S10'), ('age', '<i4')])

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

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

  1. >>import numpy as np
  2. >>> x = np.array([3, 1, 2])
  3. >>> a=np.argsort(x)
  4. >>a #升序
  5. #argsort函数返回的是数组值从小到大的索引值,[3, 1, 2]从小到大为[123],期对应的索引为[120]
  6. array([1, 2, 0])
  7. >>np.argsort(-x) #降序
  8. array([0, 2, 1], dtype=int64)
  9. >>x[a] #以排序后的顺序重构原数组
  10. array([1, 2, 3])
  11. #二维数组
  12. >>x=np.array([[0,12,48],[4,18,14],[7,1,99]])
  13. >>a1=np.argsort(x)
  14. >>a1
  15. array([[0, 1, 2],
  16. [0, 2, 1],
  17. [1, 0, 2]], dtype=int64)
  18. #以排序后的顺序重构原数组,注意与一维数组的形式不一样
  19. >>np.array([np.take(x[i],x[i].argsort())for i in range(3)])
  20. array([[ 0, 12, 48],
  21. [ 4, 14, 18],
  22. [ 1, 7, 99]])
  23. >>x[x[:,2].argsort()] #按照第三列对行进行排序
  24. array([[ 4, 18, 14],
  25. [ 0, 12, 48],
  26. [ 7, 1, 99]])
  27. >>x.T[x.T[:,2].argsort()].T #按照第三行对列进行排序
  28. array([[12, 0, 48],
  29. [18, 4, 14],
  30. [ 1, 7, 99]])
  31. >>x[:,x[2].argsort()] #还可以这样写
  32. array([[12, 0, 48],
  33. [18, 4, 14],
  34. [ 1, 7, 99]])

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

参数描述
'axis'数组排序时的基准,axis=0,按行排列;axis=1,按列排列
'keys'排序的参照物包括数组或包含N维的的元组,默认值为最后一行,(如果为二维数组则指最后一列)
  1. >>import numpy as np
  2. >>x=np.array([[0,12,48],[4,18,14],[7,1,99]])
  3. >>np.lexsort(x)
  4. array([1, 0, 2], dtype=int64) #返回索引值
  5. >>a=np.array([1,5,1,4,3,4,4])
  6. >>b=np.array([9,4,0,4,0,2,1])
  7. >>> ind=np.lexsort((b,a))
  8. >>ind #将长度相同的a,b组合,再根据a值的大小进行排序,再考虑b值
  9. array([2, 0, 4, 6, 5, 3, 1], dtype=int64)
  10. >>list(zip(a[ind],b[ind]))
  11. [(1, 0), (1, 9), (3, 0), (4, 1), (4, 2), (4, 4), (5, 4)]
  12. >>> c=[[1,5,1,4,3,4,4],[9,4,0,4,0,2,1]]
  13. >>> np.lexsort(c) # 此种情况与先b后a的情况一致
  14. array([2, 4, 6, 5, 3, 1, 0], dtype=int64)
  15. #其他方法
  16. #按最后一列顺序排序
  17. >>x[np.lexsort(x.T)]
  18. array([[ 4, 18, 14],
  19. [ 0, 12, 48],
  20. [ 7, 1, 99]])
  21. #按最后一列逆序排序
  22. >>x[np.lexsort(-x.T)]
  23. array([[ 7, 1, 99],
  24. [ 0, 12, 48],
  25. [ 4, 18, 14]])
  26. #按第一列顺序排序
  27. >>x[np.lexsort(x[:,::-1].T)]
  28. array([[ 0, 12, 48],
  29. [ 4, 18, 14],
  30. [ 7, 1, 99]])
  31. #按最后一行顺序排序
  32. >>x.T[np.lexsort(x)].T
  33. array([[12, 0, 48],
  34. [18, 4, 14],
  35. [ 1, 7, 99]])
  36. #按第一行顺序排序
  37. >>x.T[np.lexsort(x[::-1,:])].T
  38. array([[ 0, 12, 48],
  39. [ 4, 18, 14],
  40. [ 7, 1, 99]])
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/638622
推荐阅读
相关标签
  

闽ICP备14008679号