排序,条件筛选 2018/11/11 2018/11/30
1.反序
values[ : :-1 ] #可以返回一个反序的列表
2.sort排序
np.sort(a, axis=-1, kind='quicksort', order=None)#返回输入数组的排序副本
a.sort(axis=1) #就地排序
# 参数:axis: 无参数数组会被展开;kind: 默认为'quicksort'(快速排序)
# order: 如果数组包含字段,则是要排序的字段
# 实例1:
a = np.array([[4,3,7],[5,9,1]])
b=np.sort(a) # 本例中相当于np.sort(a,axis=1);返回副本
b # array([[3, 4, 7], [1, 5, 9]])
a # array([[3, 7],[9, 1]])
a.sort() # 就地排序
a # array([[3, 4, 7], [1, 5, 9]])
a = np.array([[4,3,7],[5,9,1]])
np.sort(a, axis=None)#array([1, 3, 4, 5, 7, 9])
np.sort(a,axis=0) #array([[4, 3, 1],[5, 9, 7]])
# 实例2:在 sort 函数中排序字段
dtype = [('name', 'S10'), ('height', float), ('age', int)]
values = [('Arm', 1.8, 40), ('Tom', 1.9, 30), ('Gass', 1.7, 30)]
a = np.array(values, dtype=dtype) # create a structured array
np.sort(a, order='height') # 身高排序
# array([(b'Gass', 1.7, 30), (b'Arm', 1.8, 40), (b'Tom', 1.9, 30)],
dtype=[('name', 'S10'), ('height', '<f8'), ('age', '<i4')])
np.sort(a, order=['age', 'height']) #先按年龄,在按身高排序
# array([(b'Gass', 1.7, 30), (b'Tom', 1.9, 30), (b'Arm', 1.8, 40)],
# dtype=[('name', 'S10'), ('height', '<f8'), ('age', '<i4')])
3.np.argsort
np.argsort(a, axis=-1, kind='quicksort', order=None)#返回数组排序的索引值
# 实例1:
a = np.array([4, 3, 1, 2])
j = np.argsort(a) # array([2, 3, 1, 0])
a[j] # array([1, 2, 3, 4])
# 实例2:
values= np.array([ '2:first ',' 2 :second', '1:first' , '1:second' ,'1:third'])
key = np.array ([2, 2, 1, 1, 1])
indexer = key.argsort(kind='mergesort') # array([2, 3, 4, 0, 1], dtype=int64)
values.take(indexer) # array(['1:first', '1:second', '1:third', '2:first ', ' 2 :second'],dtype='<U10')
# 稳定排序算法保持等价元素相对位置;
# mergesort 是稳定排序,性能比默认quicksort 要差。
4.lexsort
lexsort(keys, axis=-1)#使用一系列键执行间接稳定排序;排序时优先照顾靠后的列(副本)
# 实例1:Sort names: first by names, then by first_name.
names = ('Tom', 'Mark', 'Tom')
first_names = ('Bob', 'Gass', 'Alice')
ind = np.lexsort((first_names, names)) #先通过名字排序,然后在通过第一个名字排序
ind # array([1, 2, 0], dtype=int64)
[names[i] + ", " + first_names[i] for i in ind]# ['Mark, Gass', 'Tom, Alice', 'Tom, Bob']
# 实例2:两列数组排序:
a = [1,5,1,4,3,4,4] # First column
b = [9,4,0,4,0,2,1] # Second column
ind = np.lexsort((b,a)) # Sort by a, then by b
ind # array([2, 0, 4, 6, 5, 3, 1], dtype=int64)
[(a[i],b[i]) for i in ind] # [(1, 0), (1, 9), (3, 0), (4, 1), (4, 2), (4, 4), (5, 4)]
# 对比argsort:
[(a[i],b[i]) for i in np.argsort(a)]# [(1, 9), (1, 0), (3, 0), (4, 4), (4, 2), (4, 1), (5, 4)]
# 结构设置argsort排序:
x = np.array([(1,9), (5,4), (1,0), (4,4), (3,0), (4,2), (4,1)],
dtype=np.dtype([('x', int), ('y', int)]))
np.argsort(x) # or np.argsort(x, order=('x', 'y'))
# array([2, 0, 4, 6, 5, 3, 1])
# 说明:
# 键的应用顺序是从最后一个传入的算起的。names是先于first_names被应用。
# Series和DataFrame的sort index以及Series.order方法就是通过这些函数的变体(考虑缺失值)
5.复数排序
np.msort(a) 数组按第一个轴排序,返回排序后副本。相等 np.sort(a, axis=0)
np.sort_complex(a) 对复数按照先实部后虚部的顺序进行排序。
# 复数排序:
np.sort_complex([5, 3, 6, 2, 1]) # array([ 1.+0.j, 2.+0.j, 3.+0.j, 5.+0.j, 6.+0.j])
np.sort_complex([1+2j, 2-1j,3-2j,3-3j,3+5j])# array([1.+2.j, 2.-1.j, 3.-3.j, 3.-2.j, 3.+5.j])
6.分区排序
# partition() 分区排序:
a = np.array([23, 24, 22, 21])
np.partition(a, 3) # 将数组 a 从小到大排列,比第3小的放在前面,大的放在后面
# array([22, 21, 23, 24])
np.partition(a, (1, 3)) # 小于1的在前面,大于3 的在后面,1和3之间的在中间
# array([21, 22, 23, 24])
# 找到数组的第 3 小(index=2)的值和第 2 大(index=-2)的值
x = np.array([23, 24, 22, 21])
x[np.argpartition(x, 3)] # array([22, 21, 23, 24])
x[np.argpartition(x, (1, 3))] # array([21, 22, 23, 24])
arr = np.array([46, 57, 23, 39, 1, 10, 0, 120])
b=arr[np.argpartition(arr, 2)] # array([ 0, 1, 10, 39, 57, 23, 46, 120])
b[2] # 10
b=arr[np.argpartition(arr, -2)] #array([ 10, 39, 23, 0, 1, 46, 57, 120])
b[-2] #57
# 同时找到第 3 和第 4 小的值。
# 注意这里,用 [2,3] 同时将第 3 和第 4 小的排序好,然后可以分别通过下标 [2] 和 [3] 取得。
b=arr[np.argpartition(arr, [2,3])]# array([ 0, 1, 10, 23, 57, 39, 46, 120])
b[2] # 10
b[3] # 23
7.argmax,argmin
np.argmax(a, axis=None, out=None)/argmin#寻找最小值和最大值索引
# 实例1:1D
a = np.array([14, 13, 11, 12])
i_max = np.argmax(a)
i_min = np.argmin(a)
a[i_max], a[i_min] # (14, 11)
# 实例2:2D
a = np.array([[30,40,70],[80,20,10],[50,90,60]])
b=np.argmax(a)#7
a.flatten()[b] #90
maxindex = np.argmax(a, axis = 0)#array([1, 2, 0], dtype=int64)
a[maxindex,[0,1,2]] #array([80, 90, 70])
maxindex = np.argmax(a, axis = 1)#array([2, 0, 1], dtype=int64)
a[[0,1,2],maxindex] #array([70, 80, 90])
b=np.argmin(a)#5
a.flatten()[b] #10
minindex = np.argmin(a, axis = 0)#array([0, 1, 1], dtype=int64)
a[minindex,[0,1,2]] #array([30, 20, 10])
minindex = np.argmin(a, axis = 1)#array([0, 2, 0], dtype=int64)
a[[0,1,2],minindex] #array([30, 10, 50])
8.searchsorted
searchsorted在有序数组上执行二分查找的数组
# 只要将值插入到它返回的那个位置就能维持数组的有序性
# 对于元素0, searchsorted会返回0。这是因为其默认行为是返回相等值组的左侧索引
# 实例1:
arr= np.array([0, 1, 7, 12, 15])
arr .searchsorted(9) #3
arr.searchsorted([0, 8, 11, 16])# array([0, 3, 3, 5], dtype=int64)
arr = np.array([0, 0, 0, 1, 1, 1, 1])
arr.searchsorted ( [ 0, 1]) # array([0, 3], dtype=int64)
arr.searchsorted([0, 1], side='right ')# array([3, 7], dtype=int64)
#实例2:search sorted用法-数据数组拆分:
data = np .floor(np.random.uniform(0, 10000, size=50))
bins= np.array([0, 100, 1000, 5000, 10000])
data
# array([4915., 533., 5741., 1467., 5893., 6997., 1023., 4140., 6944.,
# 4141., 499., 5358., 6637., 5148., 9445., 5865., 9034., 1374.,
# 1392., 8073., 3976., 1653., 9275., 3477., 7508., 7259., 8833.,
# 6236., 7509., 3488., 2699., 8958., 4280., 9648., 6634., 6216.,
# 1147., 9494., 4499., 5783., 4081., 2370., 9033., 5736., 28.,
# 6171., 3266., 5270., 8859., 3572.])
# 得到各数据点所属区间的编号,其中1表示面元[0 , 100):
labels= bins.searchsorted(data)
labels
# array([3, 2, 4, 3, 4, 4, 3, 3, 4, 3, 2, 4, 4, 4, 4, 4, 4, 3, 3, 4, 3, 3,
# 4, 3, 4, 4, 4, 4, 4, 3, 3, 4, 3, 4, 4, 4, 3, 4, 3, 4, 3, 3, 4, 4,
# 1, 4, 3, 4, 4, 3], dtype=int64)
#实例3:digitize函数计算面元编号
np.digitize(data, bins)#结果同时
索引
1.nonzero
numpy.nonzero(a) #返回输入数组中非零元素的索引。
# 实例
a = np.array([30,0,20,50,0,60])
np.nonzero (a)# (array([0, 2, 3, 5], dtype=int64),)
a = np.array([[30,40,0],[0,20,10],[50,0,60]])
b=np.nonzero (a)
# (array([0, 0, 1, 1, 2, 2], dtype=int64),array([0, 1, 1, 2, 0, 2], dtype=int64))
a[b] #array([30, 40, 20, 10, 50, 60])
2.where
numpy.where(condition, [x, y]) 函数返回输入数组中满足给定条件的元素的索引。
# 实例
x = np.arange(9).reshape(3, 3)
y = np.where(x > 3)# (array([1, 1, 2, 2, 2], dtype=int64), array([1, 2, 0, 1, 2], dtype=int64))
x[y] #array([4, 5, 6, 7, 8])
3.extract
numpy.extract() 函数根据某个条件从数组中抽取元素,返回满条件的元素。
# 实例
x = np.arange(9.).reshape(3, 3)
# 定义条件, 选择偶数元素
condition = np.mod(x,2) == 0
condition #array([[ True, False, True],[False, True, False],[ True, False, True]])
# 使用条件提取元素:
np.extract(condition, x)#array([0., 2., 4., 6., 8.])
备注:
可用排序算法
kind 速度 稳定性 工作空间 最坏的情况
quicksort 1 No 0 O(n**2) 快速排序
mergesort 2 yes n/2 O(n log n) 合并排序
heapsort 3 No 0 O(n log n) 堆排序