Numpy排序算法

种类 速度 最坏复杂度 工作空间 稳定性
quicksort(快速排序) 1 O(n^2) 0 不稳定
mergesort(归并排序) 2 O(n * log(n)) ~n/2 稳定
heapsort(堆排序) 3 O(n * log(n)) 0 不稳定

sort()排序

sort()对输入数组执行排序,并返回一个数组副本

  1. numpy.sort(a, axis, kind, order)
  2. 其中:
  3. * a:要排序的数组
  4. * axis:沿指定轴进行排序,默认为行排序。axis=1,行排序;axis=0,列排序
  5. * kind:排序算法种类,默认为quicksort
  6. * order:若数组设置了字段,则order表示要排序的字段
  1. import numpy as np
  2. a = np.array([[3, 7], [9, 1]])
  3. print('a数组是:')
  4. print(a)
  5. # 调用sort()函数
  6. print(np.sort(a))
  7. # 按列排序:
  8. print(np.sort(a, axis=0))
  9. # 设置在sort函数中排序字段
  10. dt = np.dtype([('name', 'S10'), ('age', int)])
  11. a = np.array([("raju", 21), ("anil", 25), ("ravi", 17), ("amar", 27)], dtype=dt)
  12. # 再次打印a数组
  13. print(a)
  14. # 按name字段排序
  15. print(np.sort(a, order='name'))
  16. # 输出结果如下:
  17. """
  18. a数组是:
  19. [[3 7]
  20. [9 1]]
  21. [[3 7]
  22. [1 9]]
  23. [[3 1]
  24. [9 7]]
  25. [(b'raju', 21) (b'anil', 25) (b'ravi', 17) (b'amar', 27)]
  26. [(b'amar', 27) (b'anil', 25) (b'raju', 21) (b'ravi', 17)]
  27. """

argsort()排序并返回索引

argsort()沿指定轴排序,对输入数组的元素值进行排序,并返回排序后的实际索引数组(元素值完成排序,但索引未排序)

  1. import numpy as np
  2. a = np.array([90, 29, 89, 12])
  3. print("原数组", a)
  4. sort_ind = np.argsort(a) # 排序后的实际索引
  5. print("打印排序元素索引值", sort_ind)
  6. # 使用索引数组对原数组排序
  7. sort_a = a[sort_ind] # sort_a为已排序后的数组
  8. print("打印排序数组")
  9. for i in sort_ind:
  10. print(a[i], end=" ")
  11. # 输出结果如下:
  12. """
  13. 原数组 [90 29 89 12]
  14. 打印排序元素索引值 [3 1 2 0]
  15. 打印排序数组
  16. 12 29 89 90
  17. """

lexsort()排序并返回索引(键值对)

lexsort()**key**序列对数组进行排序(适用于键值对数据序列),并返回一个排序后的索引数组

  1. np.lexsort((b,a)) # a为主排序key
  1. import numpy as np
  2. a = np.array(['a', 'b', 'c', 'd', 'e'])
  3. b = np.array([12, 90, 380, 12, 211])
  4. ind = np.lexsort((a, b))
  5. # 打印排序元素的索引数组
  6. print(ind)
  7. # 使用索引数组对数组进行排序
  8. for i in ind:
  9. print(a[i], b[i])
  10. # 输出结果如下:
  11. """
  12. [0 3 1 4 2]
  13. a 12
  14. d 12
  15. b 90
  16. e 211
  17. c 380
  18. """

nonzero()查找非零元素索引

nonzero()该函数从数组中查找非零元素的索引位置

  1. import numpy as np
  2. b = np.array([12, 90, 380, 0, 211])
  3. print("原数组b", b)
  4. print("打印非0元素的索引位置")
  5. print(b.nonzero())
  6. # 输出结果如下:
  7. """
  8. 原数组b [ 12 90 380 0 211]
  9. 打印非0元素的索引位置
  10. (array([0, 1, 2, 4], dtype=int64),)
  11. """

where()查找符合条件的索引

where()函数返回值是满足了给定条件的元素索引值

  1. import numpy as np
  2. b = np.array([12, 90, 380, 12, 211])
  3. print(np.where(b > 12))
  4. c = np.array([[20, 24], [21, 23]])
  5. print(np.where(c > 20))
  6. # 输出结果如下:
  7. """
  8. (array([1, 2, 4], dtype=int64),)
  9. (array([0, 1, 1], dtype=int64), array([1, 0, 1], dtype=int64))
  10. """

extract()返回符合条件的元素值

extract()函数的返回值是满足了给定条件的元素值

  1. np.extract(condition, arr)
  2. 其中:
  3. * condition:是arr数组的给定条件判断后的布尔类型数组
  4. * arr:与condition数组大小相同的数组
  1. import numpy as np
  2. x = np.arange(9.).reshape(3, 3)
  3. # 打印数组x:
  4. print(x)
  5. # 设置条件选择偶数元素
  6. condition = np.mod(x, 2) == 0
  7. # 输出布尔值数组
  8. print(condition)
  9. # 按condition提取满足条件的元素值
  10. print(np.extract(condition, x))
  11. # 输出结果如下:
  12. """
  13. [[0. 1. 2.]
  14. [3. 4. 5.]
  15. [6. 7. 8.]]
  16. [[ True False True]
  17. [False True False]
  18. [ True False True]]
  19. [0. 2. 4. 6. 8.]
  20. """

argmax()最大值索引

argmax()函数返回值是最大值的索引

  • 不指定axis参数,默认将数组展开为一维数组后,查找最大值索引。 ```python import numpy as np

a = np.array([[30, 40, 70], [80, 20, 10], [50, 90, 60]])

a数组

print(a)

argmax() 函数

print(np.argmax(a)) #

将数组以一维展开

print(a.flatten())

沿轴 0 的最大值索引:

maxindex = np.argmax(a, axis=0) print(maxindex)

沿轴 1 的最大值索引

maxindex = np.argmax(a, axis=1) print(maxindex)

输出结果如下:

“”” [[30 40 70] [80 20 10] [50 90 60]] 7 [30 40 70 80 20 10 50 90 60] [1 2 0] [2 0 1] “””

  1. <a name="cqqVV"></a>
  2. # `argmin()`最小值索引
  3. `argmax()`与`argmin()`类似,**查找的是最小值索引**。
  4. ```python
  5. import numpy as np
  6. b = np.array([[3, 4, 7], [8, 2, 1], [5, 9, 6]])
  7. print('数组b:')
  8. print(b)
  9. # 调用 argmin()函数
  10. minindex = np.argmin(b)
  11. print(minindex)
  12. # 展开数组中的最小值:
  13. print(b.flatten()[minindex])
  14. # 沿轴 0 的最小值索引:
  15. minindex = np.argmin(b, axis=0)
  16. print(minindex)
  17. # 沿轴 1 的最小值索引:
  18. minindex = np.argmin(b, axis=1)
  19. print(minindex)
  20. # 输出结果如下:
  21. """
  22. 数组b:
  23. [[3 4 7]
  24. [8 2 1]
  25. [5 9 6]]
  26. 5
  27. 1
  28. [0 1 1]
  29. [0 2 0]
  30. """