Numpy数组排序

这篇博客详细介绍了Numpy库中的数组排序方法,包括numpy.sort()、ndarray.sort()和argsort()函数,以及lexsort()和内置的sorted()函数。重点讲解了排序参数如axis、kind和order的使用,并指出numpy.sort()和ndarray.sort()的区别。此外,还提到了如何通过key参数自定义排序方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • numpy.sort(a, axis=-1, kind='quicksort', order=None):返回已排序新数组

参数说明: axis:可选参数,取值整数或None,若axis为None,数组先偏平化(降维),再排序;若axis=N,表示沿着数组的轴N排序,默认axis=-1,表示沿数组的最后一条轴排序

               kind:排序算法,取值为quicksort、mergesort、heapsort分别表示快速排序、合并排序、堆排序,默认取值为quicksort

              order:在结构化数组中,可以指定按某个字段排序

import numpy as np
#numpy.sort(a, axis=-1, kind='quicksort', order=None)
arr = np.array([[ 3,  2],[ 1,  6],[ 2,  1],[ 0,  9],[ 4, 8],[ 5, 7]])
np.sort(arr)#默认axis=-1
np.sort(arr,axis=-1)#等同np.sort(arr)
np.sort(arr,axis=0)#array([[0, 1],[1, 2],[2, 6],[3, 7],[4, 8],[5, 9]])
#理解多维数组按指定轴排序
arr1 = np.array([[[ 3,  2],[ 1,  6],[ 2,  1]],[[ 0,  9],[ 4, 8],[ 5, 7]]])
np.sort(arr1,axis=0)#array([[[0, 2],[1, 6],[2, 1]],[[3, 9],[4, 8],[5, 7]]])
np.sort(arr1,axis=1)#array([[[1, 1],[2, 2],[3, 6]],[[0, 7],[4, 8],[5, 9]]])
np.sort(arr1,axis=-1)#array([[[2, 3],[1, 6],[1, 2]],[[0, 9],[4, 8],[5, 7]]])
#order:结构化数组,指定某列进行排序
data = [(2,'c',85.4),(3,'java',90),(4,'php',88)]
arr2 = np.array(data,dtype =[('stno',int),('cname','S10'),('score',float)])
np.sort(arr2,order='score')
np.sort(arr2,order = ['stno','score'])#多列组合排序
#结论:numpy.sort排序后生产一个新数组
  • numpy.ndarray.sort(axis=-1, kind='quicksort', order=None):用法同numpy.sort相同,区别只是该方法是在原数组就地排序
import numpy as np
#numpy.ndarray.sort(axis=-1, kind='quicksort', order=None)
arr = np.array([[ 3,  2],[ 1,  6],[ 2,  1],[ 0,  9],[ 4, 8],[ 5, 7]])
arr.sort(axis=0)#无返回值
arr#array([[0, 1],[1, 2],[2, 6],[3, 7],[4, 8],[5, 9]])
  • numpy.argsort(a, axis=-1, kind='quicksort', order=None):间接排序,返回数组排序后元素对应的位置整数组成的索引数组(又称索引器)
#间接排序:根据一个或多个键对数据集进行排序,返回的不是已排好序数据本身,而是返回数据对应的位置索引
import numpy as np
#numpy.argsort(a, axis=-1, kind='quicksort', order=None):返回由整数组成的索引数组(索引器),索引值表示原数组元素所在位置
#一维数组应用
arr = np.array([5,0,1,3,2,4])
#利用numpy对象调用
np.argsort(arr)#array([1, 2, 4, 3, 5, 0], dtype=int64)已排序数据对应索引位置
arr[np.argsort(arr)]#array([0, 1, 2, 3, 4, 5])
#用数组实例调用
arr.argsort()#np.argsort(arr)
arr[arr.argsort()]
#多维数组应用
arr1 = np.array([[ 3,  2],[ 1,  6],[ 2,  1],[ 0,  9],[ 4, 8],[ 5, 7]])
arr1[:,0].argsort()
arr1[arr1[:,0].argsort(),:]#按第一列顺序排序
arr1[0].argsort()
arr1[:,arr1[0].argsort()]#按第一行顺序排序
#order参数使用
data = [(2,'c',85.4),(3,'java',90),(5,'php',88),(4,'php',88)]
arr2 = np.array(data,dtype = [('stno',int),('cname','S10'),('score',float)])
arr2.argsort(order='score')
arr2.argsort(order=['score','stno'])#先按score排序,在按stno排序
arr2[arr2.argsort(order=['score','stno'])]#获取排序后数据
  • numpy.lexsort(keys, axis=-1):和numpy.argsort类似,可以对对个键数组执行间接排序
import numpy as np
#numpy.lexsort(keys, axis=-1)
data = [(2,'c',85.4),(3,'java',90),(5,'php',88),(4,'php',88)]
arr2 = np.array(data,dtype = [('stno',int),('cname','S10'),('score',float)])
idx = np.lexsort([arr2['stno'],arr2['score']])#先按score排序,再按stno排序
arr2[idx]
#结论:键的应用顺序是从keys序列中最后一个传入的算起
  • sorted(iterable, key=None, reverse=False):python内置的全局函数,返回一个已排序的新列表,key:自定义函数,指定排序方式
import numpy as np
#sorted(iterable, key=None, reverse=False)
data = [(2,'c',85.4),(3,'java',90),(5,'php',88),(4,'php',88)]
arr2 = np.array(data,dtype = [('stno',int),('cname','S10'),('score',float)])
arr2
sorted(arr2,key = lambda x :x['score'])#生成列表[(2, b'c', 85.4), (5, b'php', 88.0), (4, b'php', 88.0), (3, b'java', 90.0)]
sorted(arr2,key = lambda x :x['score'],reverse=True)#逆序输出


import operator as op
sorted(arr2,key = op.itemgetter(2))#若果多个元素具有相同的key,则排序前后他们的顺序不变[(2, b'c', 85.4), (5, b'php', 88.0), (4, b'php', 88.0), (3, b'java', 90.0)]
sorted(arr2,key = op.itemgetter(0,2))#先按stno排序,再按score排
sorted(sorted(arr2,key = op.itemgetter(0)),key =op.itemgetter(2))#等同sorted(arr2,key = op.itemgetter(2,0))注意嵌套时,排序顺序






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值