8. 数组的排序

  • 数组排序默认使用快排
  • 根据选择,可以选用其他方式排序
  • 可选参数还有axis,可以选择沿着哪个方向排序,此时把这个方向的数据当初独立数组对待

8.1. sort

  • 默认快排, 其他归并排序,堆排序, 稳定排序
  • 不修改源数据,返回排好的数据下使用np.sort(data)
  • 修改数据源,使用 data.sort()
x = np.random.randint(20, size =10)
print("排序前 X = ", x)



a = np.sort(x)
print("排序后 X = ", x)
print("排序后 a = ", a)

x.sort()
print("修改数据源排序后 X = ", x)
排序前 X =  [ 3  8  5  7 17  0 16 16  1  8]
排序后 X =  [ 3  8  5  7 17  0 16 16  1  8]
排序后 a =  [ 0  1  3  5  7  8  8 16 16 17]
修改数据源排序后 X =  [ 0  1  3  5  7  8  8 16 16 17]

8.2. argsort

  • 返回排序后数据的索引
x = np.random.randint(20, size =10)
print("排序前 X = ", x)

a = np.argsort(x)
print("排序后的索引: ", a)
排序前 X =  [10  2  0  6 10  3  9  2 18  8]
排序后的索引:  [2 1 7 5 3 9 6 0 4 8]

8.3. 分隔

  • 选择出前k个最小的值,以排序第k个值为界限,小于它的在前面,等于大于它的在后面
  • 选择结果在数组左侧,其余的在数组右侧
  • 两侧排序不规则
  • 使用方法是 np.partition(x, k)
x = np.random.randint(100, size=10)
print("排序前 x= ", x)

a = np.partition(x, 4)
print("分隔后的值 x= ", a)
排序前 x=  [99 71 55 60 86 16 18 51 53 37]
分隔后的值 x=  [16 51 18 37 53 71 55 60 86 99]
x = np.random.randint(100, size=(4,5))
print("排序前 x = \n", x)

a = np.partition(x, 3, axis=1)
print("沿着axis=1分隔后的数据是 \n", a)
排序前 x = 
 [[33 16  2 12 51]
 [28 61 55 95 18]
 [30 23 72 57 89]
 [20 49 23 26  0]]
沿着axis=1分隔后的数据是 
 [[12  2 16 33 51]
 [18 28 55 61 95]
 [57 30 23 72 89]
 [ 0 20 23 26 49]]