NumPy - 排序、搜索和计数函数

NumPy中提供了各种排序相关功能。 这些排序函数实现不同的排序算法,每个排序算法的特征在于执行速度,最坏情况性能,所需的工作空间和算法的稳定性。 下表显示了三种排序算法的比较。

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

numpy.sort()

sort()函数返回输入数组的排序副本。 它有以下参数:

  1. numpy.sort(a, axis, kind, order)

其中:

序号 参数及描述
1. a 要排序的数组
2. axis 沿着它排序数组的轴,如果没有数组会被展开,沿着最后的轴排序
3. kind 默认为'quicksort'(快速排序)
4. order 如果数组包含字段,则是要排序的字段

示例

  1. import numpy as np
  2. a = np.array([[3,7],[9,1]])
  3. print '我们的数组是:'
  4. print a
  5. print '\n'
  6. print '调用 sort() 函数:'
  7. print np.sort(a)
  8. print '\n'
  9. print '沿轴 0 排序:'
  10. print np.sort(a, axis = 0)
  11. print '\n'
  12. # 在 sort 函数中排序字段
  13. dt = np.dtype([('name', 'S10'),('age', int)])
  14. a = np.array([("raju",21),("anil",25),("ravi", 17), ("amar",27)], dtype = dt)
  15. print '我们的数组是:'
  16. print a
  17. print '\n'
  18. print '按 name 排序:'
  19. print np.sort(a, order = 'name')

输出如下:

  1. 我们的数组是:
  2. [[3 7]
  3. [9 1]]
  4. 调用 sort() 函数:
  5. [[3 7]
  6. [1 9]]
  7. 沿轴 0 排序:
  8. [[3 1]
  9. [9 7]]
  10. 我们的数组是:
  11. [('raju', 21) ('anil', 25) ('ravi', 17) ('amar', 27)]
  12. name 排序:
  13. [('amar', 27) ('anil', 25) ('raju', 21) ('ravi', 17)]

numpy.argsort()

numpy.argsort()函数对输入数组沿给定轴执行间接排序,并使用指定排序类型返回数据的索引数组。 这个索引数组用于构造排序后的数组。

示例

  1. import numpy as np
  2. x = np.array([3, 1, 2])
  3. print '我们的数组是:'
  4. print x
  5. print '\n'
  6. print '对 x 调用 argsort() 函数:'
  7. y = np.argsort(x)
  8. print y
  9. print '\n'
  10. print '以排序后的顺序重构原数组:'
  11. print x[y]
  12. print '\n'
  13. print '使用循环重构原数组:'
  14. for i in y:
  15. print x[i],

输出如下:

  1. 我们的数组是:
  2. [3 1 2]
  3. x 调用 argsort() 函数:
  4. [1 2 0]
  5. 以排序后的顺序重构原数组:
  6. [1 2 3]
  7. 使用循环重构原数组:
  8. 1 2 3

numpy.lexsort()

函数使用键序列执行间接排序。 键可以看作是电子表格中的一列。 该函数返回一个索引数组,使用它可以获得排序数据。 注意,最后一个键恰好是 sort 的主键。

示例

  1. import numpy as np
  2. nm = ('raju','anil','ravi','amar')
  3. dv = ('f.y.', 's.y.', 's.y.', 'f.y.')
  4. ind = np.lexsort((dv,nm))
  5. print '调用 lexsort() 函数:'
  6. print ind
  7. print '\n'
  8. print '使用这个索引来获取排序后的数据:'
  9. print [nm[i] + ", " + dv[i] for i in ind]

输出如下:

  1. 调用 lexsort() 函数:
  2. [3 1 0 2]
  3. 使用这个索引来获取排序后的数据:
  4. ['amar, f.y.', 'anil, s.y.', 'raju, f.y.', 'ravi, s.y.']

NumPy 模块有一些用于在数组内搜索的函数。 提供了用于找到最大值,最小值以及满足给定条件的元素的函数。

numpy.argmax()numpy.argmin()

这两个函数分别沿给定轴返回最大和最小元素的索引。

示例

  1. import numpy as np
  2. a = np.array([[30,40,70],[80,20,10],[50,90,60]])
  3. print '我们的数组是:'
  4. print a
  5. print '\n'
  6. print '调用 argmax() 函数:'
  7. print np.argmax(a)
  8. print '\n'
  9. print '展开数组:'
  10. print a.flatten()
  11. print '\n'
  12. print '沿轴 0 的最大值索引:'
  13. maxindex = np.argmax(a, axis = 0)
  14. print maxindex
  15. print '\n'
  16. print '沿轴 1 的最大值索引:'
  17. maxindex = np.argmax(a, axis = 1)
  18. print maxindex
  19. print '\n'
  20. print '调用 argmin() 函数:'
  21. minindex = np.argmin(a)
  22. print minindex
  23. print '\n'
  24. print '展开数组中的最小值:'
  25. print a.flatten()[minindex]
  26. print '\n'
  27. print '沿轴 0 的最小值索引:'
  28. minindex = np.argmin(a, axis = 0)
  29. print minindex
  30. print '\n'
  31. print '沿轴 1 的最小值索引:'
  32. minindex = np.argmin(a, axis = 1)
  33. print minindex

输出如下:

  1. 我们的数组是:
  2. [[30 40 70]
  3. [80 20 10]
  4. [50 90 60]]
  5. 调用 argmax() 函数:
  6. 7
  7. 展开数组:
  8. [30 40 70 80 20 10 50 90 60]
  9. 沿轴 0 的最大值索引:
  10. [1 2 0]
  11. 沿轴 1 的最大值索引:
  12. [2 0 1]
  13. 调用 argmin() 函数:
  14. 5
  15. 展开数组中的最小值:
  16. 10
  17. 沿轴 0 的最小值索引:
  18. [0 1 1]
  19. 沿轴 1 的最小值索引:
  20. [0 2 0]

numpy.nonzero()

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

示例

  1. import numpy as np
  2. a = np.array([[30,40,0],[0,20,10],[50,0,60]])
  3. print '我们的数组是:'
  4. print a
  5. print '\n'
  6. print '调用 nonzero() 函数:'
  7. print np.nonzero (a)

输出如下:

  1. 我们的数组是:
  2. [[30 40 0]
  3. [ 0 20 10]
  4. [50 0 60]]
  5. 调用 nonzero() 函数:
  6. (array([0, 0, 1, 1, 2, 2]), array([0, 1, 1, 2, 0, 2]))

numpy.where()

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

示例

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

输出如下:

  1. 我们的数组是:
  2. [[ 0. 1. 2.]
  3. [ 3. 4. 5.]
  4. [ 6. 7. 8.]]
  5. 大于 3 的元素的索引:
  6. (array([1, 1, 2, 2, 2]), array([1, 2, 0, 1, 2]))
  7. 使用这些索引来获取满足条件的元素:
  8. [ 4. 5. 6. 7. 8.]

numpy.extract()

extract()函数返回满足任何条件的元素。

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

输出如下:

  1. 我们的数组是:
  2. [[ 0. 1. 2.]
  3. [ 3. 4. 5.]
  4. [ 6. 7. 8.]]
  5. 按元素的条件值:
  6. [[ True False True]
  7. [False True False]
  8. [ True False True]]
  9. 使用条件提取元素:
  10. [ 0. 2. 4. 6. 8.]