Numpy数组的排序
到现在,我们已经讲解了Numpy中数组的创建,数组的操作,数组的计算:通用函数,数组的聚合与广播,Numpy数组中数据的抽取.
本章中,我们将讲解Numpy中数组的排序,Numpy为数组的排序提供了一系列方法和函数.
而且由于其向量操作,效率和速度通常我们自己写出的更高
1.概述
原生的Python中提供了sort()和sorted()函数可以对列表进行排序.但是相比于Numpy中的排序函数,效率要更低.
因此下面将讲解Numpy中的快速排序函数:np.sort和np.argsort
2.numpy.sort函数
numpy.sort方法是在不修改输入数组的基础上,返回一个排序好的数组
返回值=np.sort(数组)
例如:
array_1=np.random.randint(0,10,(10))
print(array_1)
array_2=np.sort(array_1)
print(array_2)
>>>
[3 0 9 8 1 9 5 2 9 5]
[0 1 2 3 5 5 8 9 9 9]
当数组为二维数组时候,默认对行排列
array_1=np.random.randint(0,10,(3,4))
print(array_1)
array_2=np.sort(array_1)
print(array_2)
>>>
[[7 8 9 3]
[3 7 8 1]
[2 8 0 9]]
[[3 7 8 9]
[1 3 7 8]
[0 2 8 9]]
我们可以指定axis来指定排列的方向
2.sort方法
如果我们相对数组进行永久性的排序,可以使用numpy.ndarray对象的sort方法
数组名.sort()
同样,在没有指定轴的时候,默认沿行排列
例如:
array_1=np.random.randint(0,10,(3,4))
print(array_1)
array_1.sort()
print(array_1)
>>>
[[3 6 6 4]
[1 9 2 7]
[8 6 8 0]]
[[3 4 6 6]
[1 2 7 9]
[0 6 8 8]]
3.numpy.argsort函数
numpy.argsort函数用于返回原始数组排序好的索引值
返回值=np.argsort(数组)
例如:
array_1=np.random.randint(0,10,10)
print(array_1)
array_2=np.argsort(array_1)
print(array_2)
>>>
[8 0 6 9 2 7 2 0 7 6]
[1 7 4 6 2 9 5 8 0 3]
可以发现,array_2中第一个元素是原数组中最小的元素的索引,依次向后排列
同样,如果是多维数组的话,依旧在没有指定轴的时候,按行排列
array_1=np.random.randint(0,10,(3,4))
print(array_1)
array_2=np.argsort(array_1)
print(array_2)
>>>
[[2 3 9 3]
[7 7 5 8]
[0 7 6 8]]
[[0 1 3 2]
[2 0 1 3]
[0 2 1 3]]
4.numpy.partition函数
有的时候,我们希望找出一个数组前n个最小的值,这个时候我们就可以使用numpy.partition函数
返回值=np.partition(数组名,数字n)
其中:
- numpy.partition将会返回一个新的数组,新的数组左边是我们需要的前n小的值,右边是原数组剩下的值
- 数字n是我们希望的前n小的值
例如:
array_1=np.random.randint(0,10,10)
array_2=np.partition(array_1,3)
print(array_1)
print(array_2)
>>>
[9 2 8 6 4 1 1 7 3 7]
[1 1 2 3 4 6 7 7 8 9]
可以看到,新数组的左边前三个值是原数组中前三小的值.
同样,对于多维数组没有指定方向的时候,将默认沿行排列
array_1=np.random.randint(0,10,(3,4))
array_2=np.partition(array_1,3)
print(array_1)
print(array_2)
>>>
[[2 7 8 0]
[6 4 8 9]
[4 3 2 6]]
[[0 2 7 8]
[4 6 8 9]
[2 3 4 6]]
需要注意:上面四个排序函数或者方法,指定沿行或者列进行排序,都是将行或者列看成新的数组进行排序