# 2.2.5:排序和条件筛选 ## 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()`函数返回排序后的数组副本,**只能是升序**。 ```python a=np.array([5,9,1,15,3,10]) np.sort(a) #升序排序 ''' 输出:array([ 1, 3, 5, 9, 10, 15]) ''' ``` - `np.argsort()`函数返回排序后数组值从小到大的索引,可以通过这些索引值创建**有序**的**数组**。 ```python 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`参数实现对数组的行、列进行排序,这种处理是将行或列当作独立的数组,任何行或列的值之间的关系将会丢失。 ```python 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()`函数为给定一个数,对数组进行分区,区间中的元素任意排序。 ```python 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()` 函数返回输入数组中满足给定条件的元素的索引,可以利用该函数进行 **条件筛选**。 ```python 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]) ''' ```