import numpy as np
'''
17, NumPy排序和搜索功能
NumPy 提供了多种排序函数, 这些排序函数可以实现不同的排序算法。
排序算法特征主要体现在以下四个方面:执行速度,最坏情况下的复杂度,所需的工作空间以及算法的稳定性。下表列举了三种排序算法:
NumPy排序算法
种类 速度 最坏复杂度 工作空间 稳定性
quicksort(快速排序) 1 O(n^2) 0 不稳定
mergesort(归并排序) 2 O(n * log(n)) ~n/2 稳定
heapsort(堆排序) 3 O(n * log(n)) 0 不稳定
'''
'''
(1) numpy.sort()
numpy.sort() 对输入数组执行排序,并返回一个数组副本。它具有以下参数:
numpy.sort(a, axis, kind, order)
参数说明:
a:要排序的数组;
axis:沿着指定轴进行排序,如果没有指定 axis,默认在最后一个轴上排序,若 axis=0 表示按列排序,axis=1 表示按行排序;
kind:默认为 quicksort(快速排序);
order:若数组设置了字段,则 order 表示要排序的字段。
'''
print("----17, NumPy排序和搜索功能----")
print("----(1) numpy.sort()----")
arr1 = np.array([[3, 7, 12], [9, 1, 15]])
print('arr1 : ', arr1)
# 调用sort()函数
print('np.sort(arr1) : ', np.sort(arr1))
# 按列排序:
print('np.sort(arr1, axis=0) : ', np.sort(arr1, axis=0))
# 设置在sort函数中排序字段
datatype = np.dtype([('name', 'S10'),('age', int)])
arr2 = np.array([("zhangsan", 21), ("lisi", 25), ("wanger", 17), ("chenjiu", 27)], dtype=datatype)
# 打印arr2数组
print('arr2 : ', arr2)
# 按 age 字段排序
print("np.sort(arr2, order='age') : ", np.sort(arr2, order='age'))
'''
arr1 : [[ 3 7 12]
[ 9 1 15]]
np.sort(arr1) : [[ 3 7 12]
[ 1 9 15]]
np.sort(arr1, axis=0) : [[ 3 1 12]
[ 9 7 15]]
arr2 : [(b'zhangsan', 21) (b'lisi', 25) (b'wanger', 17) (b'chenjiu', 27)]
np.sort(arr2, order='age') : [(b'wanger', 17) (b'zhangsan', 21) (b'lisi', 25) (b'chenjiu', 27)]
'''
'''
(2) numpy.argsort()
argsort() 沿着指定的轴,对输入数组的元素值进行排序,并返回排序后的元素索引数组。
'''
print("----(2) numpy.argsort()----")
arr3 = np.array([78, 24, 85, 32])
print('arr3 : ', arr3)
sort_ind = np.argsort(arr3)
print("打印排序元素索引值:", sort_ind)
# 使用索引数组对原数组排序
sort_a = arr3[sort_ind]
print("打印排序数组")
for i in sort_ind:
print(arr3[i], end=" ")
print("\n-------------------\n")
'''
arr3 : [78 24 85 32]
打印排序元素索引值: [1 3 0 2]
打印排序数组
24 32 78 85
'''
'''
(3) numpy.lexsort()
numpy.lexsort() 按键序列对数组进行排序,它返回一个已排序的索引数组,类似于 numpy.argsort()。
'''
print("----(3) numpy.lexsort()----")
a = np.array(['a', 'b', 'c', 'd', 'e'])
b = np.array([23, 40, 120, 25, 123])
print('a : ', a)
print('b : ', b)
ind = np.lexsort((a, b))
# 打印排序元素的索引数组
print('ind : ', ind)
# 使用索引数组对数组进行排序
for i in ind:
print(a[i], b[i])
print("\n-------------------\n")
'''
a : ['a' 'b' 'c' 'd' 'e']
b : [ 23 40 120 25 123]
打印排序元素的索引数组:
ind : [0 3 1 2 4]
使用索引数组对原数组进行排序:
a 23
d 25
b 40
c 120
e 123
'''
'''
(4) numpy.nonzero()
该函数从数组中查找非零元素的索引位置。
'''
print("----(4) numpy.nonzero()----")
arr4 = np.array([14, 50, 260, 0, 32, 231])
print('arr4 : ', arr4)
print("打印非0元素的索引位置:", arr4.nonzero())
'''
arr4 : [ 14 50 260 0 32 231]
打印非0元素的索引位置: (array([0, 1, 2, 4, 5], dtype=int64),)
'''
'''
(5) numpy.where()
numpy.where() 的返回值是满足了给定条件的元素索引值。
'''
print("----(5) numpy.where()----")
arr5 = np.array([12, 90, 380, 12, 211])
print('arr5 : ', arr5)
print('np.where(arr5 > 12) : ', np.where(arr5 > 12))
print('np.where(arr5 < 100) : ', np.where(arr5 < 100))
'''
arr5 : [ 12 90 380 12 211]
np.where(arr5 > 12) : (array([1, 2, 4], dtype=int64),)
np.where(arr5 < 100) : (array([0, 1, 3], dtype=int64),)
'''
'''
(6) numpy.extract()
该函数的返回值是满足了给定条件的元素值.
'''
print("----(6) numpy.extract()----")
arr6 = np.array([16, 32, 25, 13, 21])
print('arr6 : ', arr6)
# 设置条件选择偶数元素
condition = np.mod(arr6,2) == 0
# 输出布尔值数组
print('condition : ', condition)
# 按condition提取满足条件的元素值
print('np.extract(condition, arr6) : ', np.extract(condition, arr6))
'''
arr6 : [16 32 25 13 21]
condition : [ True True False False False]
np.extract(condition, arr6) : [16 32]
'''
'''
(7) numpy.argmax()
该函数返回最大值的的索引.
'''
print("----(7) numpy.argmax()----")
arr7 = np.array([[3, 4, 7], [8, 2, 1], [5, 9, 6]])
print('arr7 : ', arr7)
# argmax() 函数
print('np.argmax(arr7) : ', np.argmax(arr7))
# 将数组以一维展开
print('arr7.flatten() : ', arr7.flatten())
# 沿轴 0 的最大值索引:
maxindex0 = np.argmax(arr7, axis=0)
print('maxindex0 : ', maxindex0)
# 沿轴 1 的最大值索引
maxindex1 = np.argmax(arr7, axis=1)
print('maxindex1 : ', maxindex1)
'''
arr7 : [[3 4 7]
[8 2 1]
[5 9 6]]
np.argmax(arr7) : 7
arr7.flatten() : [3 4 7 8 2 1 5 9 6]
maxindex0 : [1 2 0]
maxindex1 : [2 0 1]
'''
'''
(8) numpy.argmin()
该函数返回最小值的索引。
'''
print("----(8) numpy.argmin()----")
arr8 = np.array([[3, 4, 8], [4, 2, 1], [7, 9, 6]])
print('arr8 : ', arr8)
# 调用 argmin()函数
minindex = np.argmin(arr8)
print('minindex : ', minindex)
# 展开数组中的最小值:
print('arr8.flatten() : ', arr8.flatten())
print('arr8.flatten()[minindex] : ', arr8.flatten()[minindex])
# 沿轴 0 的最小值索引:
maxindex0 = np.argmin(arr8, axis=0)
print('maxindex0 : ', maxindex0)
# 沿轴 1 的最小值索引:
minindex1 = np.argmin(arr8, axis=1)
print('minindex1 : ', minindex1)
'''
arr8 : [[3 4 8]
[4 2 1]
[7 9 6]]
minindex : 5
arr8.flatten() : [3 4 8 4 2 1 7 9 6]
arr8.flatten()[minindex] : 1
maxindex0 : [0 1 1]
minindex1 : [0 2 2]
'''