任务描述
本关任务:掌握numpy
的排序方法,并编写一个能筛选并排序的程序。
相关知识
说到排序想必你的脑海中会想到快速排序、插入排序、冒泡排序、选择排序等复杂的排序算法,所有的这些算法都是为了实现一个任务 —— 排序。
庆幸的是在Python
中已经封装了排序的函数,不需要我们再去造轮子了。
numpy中的快速排序
numpy
中的排序相对Python
的更加高效,默认情况下np.sort
的排序算法是 快速排序,也可以选择 归并排序 和 堆排序。
类型 | 速度 | 最坏情况 | 工作空间 | 稳定性 |
---|---|---|---|---|
快速排序 | 1 | O(n^2) | 0 | 否 |
归并排序 | 2 | O(n*log(n)) | ~n/2 | 是 |
堆排序 | 3 | O(n*log(n)) | 0 | 否 |
np.sort()
函数返回排序后的数组副本,只能是升序。
a=np.array([5,9,1,15,3,10])
np.sort(a) #升序排序
'''
输出:array([ 1, 3, 5, 9, 10, 15])
'''
np.argsort()
函数返回排序后数组值从小到大的索引,可以通过这些索引值创建有序的数组。
a=np.array([4,5,9,1,3])
b=np.argsort(a) #对a使用argsort函数
print(b)
'''
输出:array([3, 4, 0, 1, 2], dtype=int64)
第一个数是最小的值的索引,第二个数是第二小的值的索引,以此类推
'''
b1=[]
for i in b: #循环获取索引对应的值
b1.append(a[i])
print(b1)
'''
输出:[1, 3, 4, 5, 9]
'''
- 沿行或列进行排序,通过
axis
参数实现对数组的行、列进行排序,这种处理是将行或列当作独立的数组,任何行或列的值之间的关系将会丢失。
a=np.array([[8,1,5,9],[5,4,9,6],[7,1,5,3]])
np.sort(a,axis=1) #沿行排序
'''
输出:array([[1, 5, 8, 9],
[4, 5, 6, 9],
[1, 3, 5, 7]])
'''
np.sort(a,axis=0) #沿列排序
'''
输出:array([[5, 1, 5, 3],
[7, 1, 5, 6],
[8, 4, 9, 9]])
'''
np.partition()
函数为给定一个数,对数组进行分区,区间中的元素任意排序。
a=np.array([8,9,2,3,1,6,4])
np.partition(a,5) #比5小的在左边,比5大的在右边
'''
输出:array([1, 3, 2, 4, 6, 8, 9])
'''
其他排序函数:
函数 | 描述 |
---|---|
msort() | 数组按第一个轴排序,返回排序后的数组副本 |
sort_complex() | 对复数按先实部后虚部的顺序进行排序 |
argpartition() | 通过关键字指定算法沿指定轴进行分区 |
where函数
np.where()
函数返回输入数组中满足给定条件的元素的索引,可以利用该函数进行 条件筛选。
a=np.array([19,5,16,22,17])
np.where(a>15) #应用where函数
'''
输出:(array([0, 2, 3, 4], dtype=int64),)
'''
a[np.where(a>15)] #获取满足条件索引的元素
'''
输出:array([19, 16, 22, 17])
'''
编程要求
请在右侧编辑器Begin-End
处补充代码,先过滤数组中大于num
的值,再对这些值进行排序。
- 具体要求请参见后续测试样例。
请先仔细阅读右侧上部代码编辑区内给出的代码框架,再开始你的编程工作!
测试说明
平台会对你编写的代码进行测试,对比你输出的数值与实际正确的数值,只有所有数据全部计算正确才能进入下一关。
测试输入:
[[55, 110, 20, 1, 34, 0, 69],[9,21,33,68,16,71,80]]
66
预期输出:
[ 68 69 71 80 110]
代码:
import numpy as np
def studen(input_data,num):
'''
将ipnut_data转换成ndarray后筛选出大于num的元素组成新的ndarray并排序
:param input_data: 测试用例,类型为list
:param num: 测试用例,类型为int
:return: result,类型为ndarray
'''
result=[]
#********* Begin *********#
data=np.array(input_data)
data=data[data>num]
result=np.sort(data)
#********* End *********#
return result