19-NumPy排序和搜索功能

NumPy排序和搜索功能

NumPy 提供了多种排序函数, 这些排序函数可以实现不同的排序算法。

排序算法特征主要体现在以下四个方面:执行速度,最坏情况下的复杂度,所需的工作空间以及算法的稳定性。下表列举了三种排序算法:

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

numpy.sort()

numpy.sort() 对输入数组执行排序,并返回一个数组副本。它具有以下参数:

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

参数说明:

  • a:要排序的数组;
  • axis:沿着指定轴进行排序,如果没有指定 axis,默认在最后一个轴上排序,若 axis=0 表示按列排序,axis=1 表示按行排序;
  • kind:默认为 quicksort(快速排序);
  • order:若数组设置了字段,则 order 表示要排序的字段。

下面看一组示例:

import numpy as np
a = np.array([[3,7],[9,1],[5,2]])
print("原始数组a:\n",a)
#调用sort()函数
print("数组a排序:\n",np.sort(a))
#按列排序:
print("数组a的0轴排序:\n",np.sort(a, axis = 0))
print("数组a的1轴排序:\n",np.sort(a, axis = 1))
#设置在sort函数中排序字段
dt = np.dtype([('name',  'S10'),('age',  int)])
b = np.array([("raju",21),("anil",25),("ravi",  17),  ("amar",27)], dtype = dt)
#再次打印a数组
print("原始数组b:\n",b)
#按name字段排序
print("数组b按name排序:\n",np.sort(b, order = 'name'))

输出结果:

原始数组a:
 [[3 7]
 [9 1]
 [5 2]]
数组a排序:
 [[3 7]
 [1 9]
 [2 5]]
数组a的0轴排序:
 [[3 1]
 [5 2]
 [9 7]]
数组a的1轴排序:
 [[3 7]
 [1 9]
 [2 5]]
原始数组b:
 [(b'raju', 21) (b'anil', 25) (b'ravi', 17) (b'amar', 27)]
数组b按name排序:
 [(b'ravi', 17) (b'raju', 21) (b'anil', 25) (b'amar', 27)]

numpy.argsort()

argsort() 沿着指定的轴,对输入数组的元素值进行排序,并返回排序后的元素索引数组。示例如下:

import numpy as np
a = np.array([90, 29, 89, 12])
print("原数组a:\n",a)
sort_ind = np.argsort(a)
print("打印排序元素索引值:\n",sort_ind)
#使用索引数组对原数组排序
sort_a = a[sort_ind]
print("打印排序数组:")
for i in sort_ind:
    print(a[i],end = " ")

输出结果:

原数组a:
 [90 29 89 12]
打印排序元素索引值:
 [3 1 2 0]
打印排序数组:
12 29 89 90

numpy.lexsort()

numpy.lexsort() 按键序列对数组进行排序,它返回一个已排序的索引数组,类似于 numpy.argsort()。

下面看一组示例:

import numpy as np
a = np.array(['a','b','c','d','e'])
b = np.array([12, 90, 380, 12, 211])
ind = np.lexsort((a,b))
#打印排序元素的索引数组
print(ind)
#使用索引数组对数组进行排序
for i in ind:
    print(a[i],b[i])  

输出结果:

[0 3 1 4 2]
a 12
d 12
b 90
e 211
c 380

NumPy 提供了许多可以在数组内执行搜索功能的函数。比如查找最值或者满足一定条件的元素。

numpy.nonzero()

该函数从数组中查找非零元素的索引位置。示例如下:

import numpy as np

b = np.array([12, 90, 380,0, 12, 211])

print("原数组b:\n", b)

print("打印非0元素的索引位置:\n",b.nonzero())

输出结果:

原数组b:
 [ 12  90 380   0  12 211]
打印非0元素的索引位置:
 (array([0, 1, 2, 4, 5], dtype=int64),)

numpy.where()

numpy.where() 的返回值是满足了给定条件的元素索引值。

import numpy as np

b = np.array([12, 90, 380, 12, 211])

print("获取数组b中所有元素大于12的索引:\n",np.where(b > 12))

c = np.array([[20, 24], [21, 23],[22,19]])

print("获取数组c中所有元素大于20的索引:\n",np.where(c > 20))

输出结果:

获取数组b中所有元素大于12的索引:
 (array([1, 2, 4], dtype=int64),)
获取数组c中所有元素大于20的索引:
 (array([0, 1, 1, 2], dtype=int64), array([1, 0, 1, 0], dtype=int64))

numpy.extract()

该函数的返回值是满足了给定条件的元素值,示例如下:

import numpy as np
x = np.arange(9.).reshape(3, 3)

print('打印数组x:\n',x)
#设置条件选择偶数元素
condition = np.mod(x,2)== 0
#输出布尔值数组
print("输出布尔值数组:\n",condition)
#按condition提取满足条件的元素值
print ("满足条件的元素:\n",np.extract(condition, x))

输出结果:

打印数组x:
 [[0. 1. 2.]
 [3. 4. 5.]
 [6. 7. 8.]]
输出布尔值数组:
 [[ True False  True]
 [False  True False]
 [ True False  True]]
满足条件的元素:
 [0. 2. 4. 6. 8.]

numpy.argmax()

该函数返回最大值的的索引,与其相反的函数是 argmin() 求最小值索引 ,示例如下:

import numpy as np
a = np.array([[30,40,70],[80,20,10],[50,90,60]])
#a数组
print ("原始数组a:\n",a)
#argmax() 函数
print ("数组a最大值的索引:\n",np.argmax(a))
#将数组以一维展开
print ("数组a以一维展开:\n",a.flatten())
#沿轴 0 的最大值索引:
maxindex = np.argmax(a, axis =  0)
print ("数组a的0轴最大值索引:\n",maxindex)
#沿轴 1 的最大值索引
maxindex = np.argmax(a, axis =  1)
print ("数组a的1轴最大值索引:\n",maxindex)

输出结果:

原始数组a:
 [[30 40 70]
 [80 20 10]
 [50 90 60]]
数组a最大值的索引:
 7
数组a以一维展开:
 [30 40 70 80 20 10 50 90 60]
数组a的0轴最大值索引:
 [1 2 0]
数组a的1轴最大值索引:
 [2 0 1]

numpy.argmin()

argmin() 求最小值索引。示例如下:

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

print ("原始数组a:\n",a)

print ("数组a最小值的索引:\n",np.argmin(a))

print ("数组a以一维展开:\n",a.flatten())

minindex = np.argmin(a, axis =  0)
print ("数组a的0轴最小值索引:\n",minindex)

minindex = np.argmin(a, axis =  1)
print ("数组a的1轴最小值索引:\n",minindex)

输出结果:

原始数组a:
 [[30 40 70]
 [80 20 10]
 [50 90 60]]
数组a最小值的索引:
 5
数组a以一维展开:
 [30 40 70 80 20 10 50 90 60]
数组a的0轴最小值索引:
 [0 1 1]
数组a的1轴最小值索引:
 [0 2 0]

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值