NumPy学习笔记17.排序、条件刷选函数

mac2024-03-28  33

NumPy排序、条件刷选函数

种类速度最坏情况工作空间稳定性‘quicksort’(快速排序)1O(n^2)0否‘mergesort’(归并排序)2O(n*log(n))~n/2是‘heapsort’(堆排序)3O(n*log(n))0否
numpy.sort()

numpy.sort函数返回输入数组的排序副本:

numpy.sort(a, axis, king, order) # a:要排序的数组 # axis:沿着它排序数组的轴,如果没有数组会被展开,沿着最后的轴排序,axis = 0按列排序,axis = 1按行排序 # kind:默认为‘quicksort’(快速排序) # order:如果数组包含字段,则要排序的字段 import numpy as np a = np.array([[3,7],[9,1]]) print('数组是:') print(a) print('\n') print('调用sort()函数:') print(np.sort(a)) print('\n') print('按列排序:') print(np.sort(a, axis = 0)) print('\n') # sort()函数中排序字段 dt = np.dtype([('name','S10'),('age',int)]) a = np.array([('jack',21),('mary',22),('hugh',23),('tom',25)],dtype = dt) print('数组是:') print(a) print('\n') print('按name排序:') print(np.sort(a, order = 'name')) 数组是: [[3 7] [9 1]] 调用sort()函数: [[3 7] [1 9]] 按列排序: [[3 1] [9 7]] 数组是: [(b'jack', 21) (b'mary', 22) (b'hugh', 23) (b'tom', 25)] 按name排序: [(b'hugh', 23) (b'jack', 21) (b'mary', 22) (b'tom', 25)]
numpy.argsort()

numpy.argsort函数返回的是数组值从小到大的索引值:

import numpy as np x = np.array([3,1,2]) print('数组是:') print(x) print('\n') print('对x调用argsort()函数:') y = np.argsort(x) print(y) print('\n') print('以排序后的顺序重构原数组:') print(x[y]) print('\n') print('使用循环重构原数组:') for i in y: print(x[i], end = ' ') 数组是: [3 1 2] 对x调用argsort()函数: [1 2 0] 以排序后的顺序重构原数组: [1 2 3] 使用循环重构原数组: 1 2 3
numpy.lexsort()

numpy.lexsort函数用于对多个序列进行排序,排序时优先照顾靠后的列。

import numpy as np nm = ('huge','mary','jack','tom') dv = ('f.y','s.y','s.y','f.y') ind = np.lexsort((dv,nm)) #排序首先排nm print('调用lexsort()函数:') print(ind) print('\n') print('使用这个索引来获取排序后的数据:') print([nm[i] + ',' + dv[i] for i in ind]) 调用lexsort()函数: [0 2 1 3] 使用这个索引来获取排序后的数据: ['huge,f.y', 'jack,s.y', 'mary,s.y', 'tom,f.y']
msort、sort_complex、partition、argpartition
函数描述msrot(a)数组按第一个轴排序,返回排序后的数组副本。np.msort(a)相等于np.sort(a, axis = 0)sort_complex(a)对复数按照先实部后虚部的顺序进行排序partition(a, kth[, axis, kind, order]指定一个数,对数组进行分区argpartition(a, kth[, axis, kind, order])可以通过关键字kind指定算法沿着指定轴对数组进行分区 import numpy as np print(np.sort_complex([5,3,6,2,1])) print(np.sort_complex([1 + 2j, 2 - 1j, 3 - 2j, 3 - 3j, 3 + 5j])) a = np.array([3,4,2,1]) # 将数组 a 中所有元素(包括重复元素)从小到大排列,3 表示的是排序数组索引为 3 的数字, # 比该数字小的排在该数字前面,比该数字大的排在该数字的后面 print(np.partition(a,3)) # 小于 1 的在前面,大于 3 的在后面,1和3之间的在中间 print(np.partition(a,(1,3))) arr = np.array([45,36,23,16,2,10,0,123]) # 找到数组的第 3 小(index=2)的值和第 2 大(index=-2)的值 print(arr[np.argpartition(arr,2)[2]]) print(arr[np.argpartition(arr,-2)[-2]]) # 同时找到第 3 和第 4 小的值。注意这里,用 [2,3] 同时将第 3 和第 4 小的排序好,然后可以分别通过下标 [2] 和 [3] 取得。 print(arr[np.argpartition(arr,[2,3])[2]]) print(arr[np.argpartition(arr,[2,3])[3]]) [1.+0.j 2.+0.j 3.+0.j 5.+0.j 6.+0.j] [1.+2.j 2.-1.j 3.-3.j 3.-2.j 3.+5.j] [2 1 3 4] [1 2 3 4] 10 45 10 16
numpy.argmax()和numpy.argmin()

分别沿给定轴返回最大和最小元素的索引:

import numpy as np a = np.array([[10,30,20],[60,40,50],[70,80,90]]) print('数组是:') print(a) print('\n') print('调用argmax()函数:') print(np.argmax(a)) print('\n') print('展开数组:') print(a.flatten()) print('\n') print('沿轴0的最大值索引:') maxindex = np.argmax(a, axis = 0) print(maxindex) print('\n') print('沿轴1的最大值索引:') maxindex = np.argmax(a, axis = 1) print(maxindex) print('\n') print ('调用 argmin() 函数:') minindex = np.argmin(a) print (minindex) print ('\n') print ('展开数组中的最小值:') print (a.flatten()[minindex]) print ('\n') print ('沿轴 0 的最小值索引:') minindex = np.argmin(a, axis = 0) print (minindex) print ('\n') print ('沿轴 1 的最小值索引:') minindex = np.argmin(a, axis = 1) print (minindex) 数组是: [[10 30 20] [60 40 50] [70 80 90]] 调用argmax()函数: 8 展开数组: [10 30 20 60 40 50 70 80 90] 沿轴0的最大值索引: [2 2 2] 沿轴1的最大值索引: [1 0 2] 调用 argmin() 函数: 0 展开数组中的最小值: 10 沿轴 0 的最小值索引: [0 0 0] 沿轴 1 的最小值索引: [0 1 0]
numpy.nonzero()

numpy.nonzero函数返回输入数组中非零元素的索引:

import numpy as np a = np.array([[10,30,20],[60,40,50],[70,80,90]]) print('数组是:') print(a) print('\n') print('调用nonzero()函数:') print(np.nonzero(a)) 数组是: [[10 30 20] [60 40 50] [70 80 90]] 调用nonzero()函数: (array([0, 0, 0, 1, 1, 1, 2, 2, 2], dtype=int64), array([0, 1, 2, 0, 1, 2, 0, 1, 2], dtype=int64))
numpy.where()

numpy.where()函数返回输入数组中满足给定条件的元素的索引:

import numpy as np x = np.arange(9.).reshape(3,3) print('数组是:') print(x) print('大于3的元素的索引:') y = np.where(x > 3) print(y) print('使用这些索引来获取满足条件的元素:') print(x[y]) 数组是: [[0. 1. 2.] [3. 4. 5.] [6. 7. 8.]] 大于3的元素的索引: (array([1, 1, 2, 2, 2], dtype=int64), array([1, 2, 0, 1, 2], dtype=int64)) 使用这些索引来获取满足条件的元素: [4. 5. 6. 7. 8.]
numpy.extract()

numpy.extract()函数根据某个条件从数组中抽取元素,返回满条件的元素。

import numpy as np x = np.arange(9.).reshape(3,3) print('数组是:') print(x) # 定义条件,选择偶数元素 condition = np.mod(x,2) == 0 print('按元素的条件值:') print(condition) print('使用条件提取元素:') print(np.extract(condition, x)) 数组是: [[0. 1. 2.] [3. 4. 5.] [6. 7. 8.]] 按元素的条件值: [[ True False True] [False True False] [ True False True]] 使用条件提取元素: [0. 2. 4. 6. 8.]

学习参考:

菜鸟教程:https://www.runoob.com/numpy/numpy-tutorial.html
最新回复(0)