📜  Numpy 排序,搜索和计数

📅  最后修改于: 2020-04-19 13:02:49             🧑  作者: Mango

排序

排序是指以特定格式排列数据。排序算法指定了按特定顺序排列数据的方式。最常见的顺序是按数字顺序或字典顺序。在Numpy中,我们可以使用库中提供的各种函数(例如sort,lexsort,argsort等)执行各种排序操作。
numpy.sort():此函数返回数组的排序副本。

# 导入库
import numpy as np
# 沿第一轴排序
a = np.array([[12, 15], [10, 1]])
arr1 = np.sort(a, axis = 0)
print ("沿第一轴 : \n", arr1)
# 沿最后一个轴排序
a = np.array([[10, 15], [12, 1]])
arr2 = np.sort(a, axis = -1)
print ("\n沿第一轴 : \n", arr2)
a = np.array([[12, 15], [10, 1]])
arr1 = np.sort(a, axis = None)
print ("\n无轴 : \n", arr1)

输出:

沿第一轴 :
 [[10  1]
 [12 15]]
沿第一轴 :
 [[10 15]
 [ 1 12]]
无轴 :
 [ 1 10 12 15]

numpy.argsort():此函数返回对数组进行排序的索引。

# Python代码演示numpy.argsort的工作
import numpy as np
# numpy数组创建
a = np.array([9, 3, 1, 7, 4, 3, 6])
# 未排序的阵列打印
print('原始阵列:\n', a)
# 排序数组索引
b = np.argsort(a)
print('原始数组的排序索引->', b)
# 使用排序索引获取排序数组,c是与b相同len的临时数组
c = np.zeros(len(b), dtype = int)
for i in range(0, len(b)):
    c[i]= a[b[i]]
print('排序数组->', c)

输出:

原始阵列:
 [9 3 1 7 4 3 6]
原始数组的排序索引-> [2 1 5 4 6 3 0]
排序数组-> [1 3 3 4 6 7 9]

numpy.lexsort():此函数使用一系列键返回间接稳定排序。

# Python代码演示numpy.lexsort()的工作
import numpy as np
# 创建了Numpy数组
# 第一列
a = np.array([9, 3, 1, 3, 4, 3, 6])
# 第二栏
b = np.array([4, 6, 9, 2, 1, 8, 7])
print('a列,b列')
for (i, j) in zip(a, b):
    print(i, ' ', j)
# 按a排序,然后按b排序
ind = np.lexsort((b, a))
print('Sorted indices->', ind)

输出:

a列,b列
9   4
3   6
1   9
3   2
4   1
3   8
6   7
排序索引-> [2 3 1 5 4 6 0]
函数 描述
numpy.ndarray.sort() 就地对数组进行排序。
numpy.msort() 返回沿第一个轴排序的数组的副本。
numpy.sort_complex() 首先使用实部,然后使用虚部对复杂数组进行排序。
numpy.partition() 返回数组的分区副本。
numpy.argpartition() 使用kind关键字指定的算法,沿给定轴执行间接分区。

 

正在搜寻

搜索是一种有助于查找给定元素或值在列表中的位置的操作或技术。在Numpy中,我们可以使用库中提供的各种函数(例如argmax,argmin,nanaargmax等)执行各种搜索操作。
numpy.argmax():此函数返回特定轴上数组max元素的索引。

# Python程序说明argmax()的工作方式
import numpy as np
# 处理二维阵列
array = np.arange(12).reshape(3, 4)
print("输入阵列 : \n", array)
# 未提及轴,因此适用于整个阵列
print("\n最大元素 : ", np.argmax(array))
# 根据索引返回最大元素的索引
print(("\n最大元素指数 : "
      , np.argmax(array, axis=0)))
print(("\n最大元素指数 : "
      , np.argmax(array, axis=1)))

输出:

输入阵列 :
 [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
最大元素 :  11
最大元素指数 :  [2 2 2 2]
最大元素指数 :  [3 3 3]

numpy.nanargmax():此函数返回特定轴上数组的max元素的索引,而忽略NaN。如果切片仅包含NaN和Infs,则结果不可信任。

# Python程序说明nanargmax()的工作方式
import numpy as np
# 处理一维阵列
array = [np.nan, 4, 2, 3, 1]
print("输入阵列 1 : \n", array)
array2 = np.array([[np.nan, 4], [1, 3]])
# 忽略NaN的索引返回最大元素的索引
print(("\n数组1中的最大值的索引 : "
       , np.nanargmax(array)))
# 处理二维阵列
print("\n输入阵列2: \n", array2)
print(("\n数组2中的最大值索引 : "
      , np.nanargmax(array2)))
print(("\n数组2的轴1处的索引 : "
      , np.nanargmax(array2, axis = 1)))

输出:

输入阵列 1 :
 [nan, 4, 2, 3, 1]
数组1中的最大值的索引 :  1
输入阵列2 :
 [[ nan   4.]
 [  1.   3.]]
数组2中的最大值索引 :  1
数组2的轴1处的索引 :  [1 1]

numpy.argmin():此函数返回沿轴返回最小值的索引。

# Python程序说明argmin()的工作
import numpy as np
# 处理一维阵列
array = np.arange(8)
print("输入矩阵 : \n", array)
# 根据索引返回最小元素的索引
print("\n最小元素指标 : ", np.argmin(array, axis=0))

输出:

输入矩阵 :
 [0 1 2 3 4 5 6 7]
最小元素指标 :  0
函数 描述
numpy.nanargmin() 返回指定轴上最小值的索引,忽略NaN。
numpy.argwhere() 查找按元素分组的非零数组元素的索引。
numpy.nonzero() 返回非零元素的索引。
numpy.flatnonzero() 在a的展平版本中返回非零的索引。
numpy.where() 根据条件从x或y中选择返回元素。
numpy.searchsorted() 查找应在其中插入元素以保持顺序的索引。
numpy.extract() 返回满足某些条件的数组元素。

 

计数

numpy.count_nonzero():计算数组中非零值的数量。

# Python程序说明count_nonzero()的工作方式
import numpy as np
# 计算非零值
a = np.count_nonzero([[0,1,7,0,0],[3,0,0,2,19]])
b = np.count_nonzero(([[0,1,7,0,0],[3,0,0,2,19]]
                     , axis=0))
print("非零值的数量为 :",a)
print("非零值的数量为 :",b)

输出:

非零值的数量为 : 5
非零值的数量为 : [1, 1, 1, 1, 1]