NumPy 包包含许多函数,可提供排序、搜索和计数所需的所有功能。下面提到的是对数组执行此类操作的最常用函数。

函数描述
sort()返回数组的排序副本。
argsort()返回索引 对数组进行排序。
lexsort()使用键序列执行间接稳定排序。
argmax()返回沿轴的最大值的索引。
argmin()返回 沿轴的最小值的索引。
where()根据条件返回元素。
nonzero()返回非零元素的索引。
extract()返回 满足某些条件的数组元素。

让我们详细讨论这些函数:

numpy.sort() 函数

NumPy sort() 函数返回指定数组的排序副本。

语法

numpy.sort(a, axis=-1, kind=None) 

参数

a必填。 指定要排序的数组。
axis可选。 指定排序的轴。如果没有,则在排序之前将数组展平。默认值为 -1,沿最后一个轴排序。
kind可选。 指定排序算法。它可以从 {'quicksort', 'mergesort', 'heapsort', 'stable'} 中获取值。默认值:'quicksort'

示例:

在下面的示例中,sort()函数是用于对二维数组的元素进行排序。由于未提供 axis 参数,因此将沿最后一个轴(按行)进行排序。

import numpy as np
Arr = np.array([[1,20,5],[21, 4, 3],[11, 5, 50]])
SortedArr = np.sort(Arr)

print("原始数组:")
print(Arr)
print("\n排序数组:")
print(SortedArr) 

上述代码的输出将是:

原始数组:
[[ 1 20  5]
 [21  4  3]
 [11  5 50]]

排序数组:
[[ 1  5 20]
 [ 3  4 21]
 [ 5 11 50]] 

示例:

要按列对数组进行排序,axis 参数可以设置为 0。当使用 axis=None 时,数组在排序前会被展平。考虑下面的示例:

import numpy as np
Arr = np.array([[1,20,5],[21, 4, 3],[11, 5, 50]])
SortedArr1 = np.sort(Arr, axis=0)
SortedArr2 = np.sort(Arr, axis=None)

print("原始数组:")
print(Arr)
print("\n排序数组1:")
print(SortedArr1)
print("\n排序数组2:")
print(SortedArr2) 

上述代码的输出将是:

原始数组:
[[ 1 20  5]
 [21  4  3]
 [11  5 50]]

排序数组1:
[[ 1  4  3]
 [11  5  5]
 [21 20 50]]

排序数组2:
[ 1  3  4  5  5 11 20 21 50] 

numpy.argsort() 函数

NumPy argsort() 函数返回对数组进行排序的索引。

语法

numpy.argsort(a, axis=-1, kind=None, order=None) 

参数

a必填。 指定要排序的数组(array_like)。
axis可选。 指定排序的轴。如果没有,则在排序之前将数组展平。默认值为 -1,沿最后一个轴排序。
kind可选。 指定排序算法。它可以从 {'quicksort', 'mergesort', 'heapsort', 'stable'} 中获取值。默认值:"快速排序"
order可选。 指定包含字段的字符串或字符串列表。当 a 是定义了字段的数组时,此参数指定需要比较字段的顺序。

示例:

在下面的示例中,argsort()函数用于获取索引,该索引进一步用于生成排序后的数组。

import numpy as np
Arr = np.array([50, 40, 10, 60, 30, 20])

#显示数组
print("原始数组:")
print(Arr)

#从 argsort() 获取索引
x = np.argsort(Arr)
print("\nIndices from argsort():")
print(x)

#产生排序数组
print("\n排序数组:")
print(Arr[x]) 

上述代码的输出将是:

原始数组:
[50 40 10 60 30 20]

Indices from argsort():
[2 5 4 1 0 3]

排序数组:
[10 20 30 40 50 60] 

示例:

order参数可用于指定哪个字段需要先排序。考虑下面的示例:

import numpy as np
Arr = np.array([(20,60),
                (20,50),
                (20,55),
                (10,75),
                (10,25),
                (10,50)], 
                dtype=[('x', '<i4'), ('y', '<i4')])

#显示数组
print("原始数组:")
print(Arr)

#产生排序数组
indices = np.argsort(Arr, order=('x','y') )
print("\n排序数组:")
print(Arr[indices]) 

上述代码的输出将是:

原始数组:
[(20, 60) (20, 50) (20, 55) (10, 75) (10, 25) (10, 50)]

排序数组:
[(10, 25) (10, 50) (10, 75) (20, 50) (20, 55) (20, 60)] 

numpy.lexsort() 函数

NumPy lexsort() 函数使用键序列执行间接稳定排序。

当提供多个排序键时,它可以解释为列,lexsort() 返回一个整数索引数组,描述多列的排序顺序。序列中的最后一个键用于主要排序顺序,倒数第二个键用于辅助排序顺序,依此类推。键参数必须是可以转换为相同形状的数组的对象序列。如果为keys参数提供了二维数组,则其行将被解释为排序键,并且根据最后一行、倒数第二行等进行排序。

语法

numpy.lexsort(keys, axis=-1) 

参数

keys必需。 指定要排序的 k 个不同的"列"。最后一列(如果键是二维数组则为最后一行)是主排序键。
axis可选。 指定要间接排序的轴。默认情况下,按最后一个轴排序。

示例:

在下面的示例中,lexsort() 函数用于先按 x 列排序,然后按 y 列排序。

import numpy as np

#x 列 - 第一列
x = np.array([10, 20, 10, 20, 10, 25, 10])
#y 列 - 第二列
y = np.array([40, 10, 45, 60, 50, 25, 30])

#获取排序的索引数组
#x 列第一,y 列第二
indices = np.lexsort((y, x))

#显示索引
print("用于对列进行排序的索引数组")
print(indices)

#使用索引对列进行排序
print("\n已排序的 x 和 y 列:")
for i in indices:
  print(x[i], y[i]) 

上述代码的输出将是:

用于对列进行排序的索引数组
[6 0 2 4 1 3 5]

已排序的 x 和 y 列:
10 30
10 40
10 45
10 50
20 10
20 60
25 25 

numpy.argmax() 和 numpy.argmin() 函数

NumPy argmax() argmin() 函数分别返回沿轴的最大值和最小值的索引。默认情况下,它是在展平数组上计算的,否则是在指定轴上计算的。

语法

numpy.argmax(a, axis=None, out=None)
numpy.argmin(a, axis=None, out=None) 

参数

a必填。 指定输入数组(array_like)。
axis可选。 指定计算最大/最小值索引的一个或多个轴。默认情况下是在展平数组上计算它。
out可选。 指定结果的输出数组。默认值为"无"。如果提供,它必须与输出具有相同的形状。

示例:

在下面的示例中,函数用于查找整个数组中最大/最小值的索引。

import numpy as np
Arr = np.arange(12).reshape(3,4)

print("Array is:")
print(Arr)

#最大值索引
idx1 = np.argmax(Arr)
print("\n最大值的索引是:", idx1)

#最小值索引
idx2 = np.argmin(Arr)
print("最小值索引为:", idx2) 

上述代码的输出将是:

Array is:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

最大值的索引是: 11
最小值索引为: 0 

示例:

当提供轴参数时,计算指定轴上的最大/最小值索引。考虑以下示例。

import numpy as np
Arr = np.arange(12).reshape(3,4)

print("Array is:")
print(Arr)

#沿轴最大值索引=0
print("\n沿轴最大值索引=0")
print(np.argmax(Arr, axis=0))

#沿轴最大值索引=1
print("\n沿轴最大值索引=1")
print(np.argmax(Arr, axis=1))

#沿轴最小值索引=0
print("\n沿轴最小值索引=0")
print(np.argmin(Arr, axis=0))

#沿轴最小值的索引=1
print("\n沿轴最小值索引=1")
print(np.argmin(Arr, axis=1)) 

上述代码的输出将是:

Array is:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

沿轴最大值索引=0
[2 2 2 2]

沿轴最大值索引=1
[3 3 3]

沿轴最小值索引=0
[0 0 0 0]

沿轴最小值索引=1
[0 0 0] 

numpy.where() 函数

NumPy where() 函数根据条件返回从 x 或 y 中选择的元素。当仅提供条件时,函数返回给定数组中满足条件的元素的索引。

语法

numpy.where(condition, x, y) 

参数

condition必填。 指定 array_like、bool。如果为 True,则产生 x,否则产生 y。
x, y可选。 指定要从中选择的 array_like 值。 x、y 和条件需要可广播到某种形状。

示例:

在下面的示例中,where()函数用于将数组中的所有负数元素替换为 0。

import numpy as np

x = np.arange(-2, 5)

#将所有负数元素替换为0
y = np.where(x > 0, x, 0)

#显示x和y的内容
print("x contains:", x)
print("y contains:", y) 

上述代码的输出将是:

x contains: [-2 -1  0  1  2  3  4]
y contains: [0 0 0 1 2 3 4] 

示例:

在此示例中,where()函数用于根据给定条件从两个数组中选择元素.

import numpy as np

x = np.asarray([[10, 20], [30, 40]])
y = np.asarray([[15, 15], [25, 25]])

#应用where条件
z = np.where(x > y, x, y)

#显示x、y、z的内容
print("x =")
print(x)
print("\ny =")
print(y)
print("\nz =")
print(z) 

上述代码的输出将是:

x =
[[10 20]
 [30 40]]

y =
[[15 15]
 [25 25]]

z =
[[15 20]
 [30 40]] 

numpy.nonzero() 函数

NumPy nonzero() 函数返回非零元素的索引。返回值是一个数组元组,一个数组对应 a 的每个维度,包含该维度中非零元素的索引。 a 中的值始终按行优先、C 风格顺序进行测试和返回。

语法

numpy.nonzero(a) 

参数

a必填。 指定输入数组(array_like)。

示例:

在下面的示例中,nonzero( ) 函数用于找出所有非零元素的索引。

import numpy as np
Arr = np.array([[1, 2, 0], 
                [0, 5, 0], 
                [7, 0, 9]])

print("Array is:")
print(Arr)

#所有非零元素的索引
x = np.nonzero(Arr)
print("\n非零元素的索引:")
print(x)

#显示所有非零元素
print("\n所有非零元素:")
print(Arr[x])
输出上述代码的内容为:
Array is:
[[1 2 0]
 [0 5 0]
 [7 0 9]]

非零元素的索引:
(array([0, 0, 1, 2, 2]), array([0, 1, 1, 0, 2]))

所有非零元素:
[1 2 5 7 9] 

示例:

条件可以应用于 nonzero() 函数,如示例所示

import numpy as np
Arr = np.array([90, 80, 10, 20, 50])

print("Array is:")
print(Arr)

#所有大于25的元素的索引
x = np.nonzero(Arr > 25)
print("\n所有大于25的元素的索引:")
print(x)

#显示所有大于 25 的元素
print("\n所有大于 25 的元素:")
print(Arr[x])
上述代码的输出将是:
Array is:
[90 80 10 20 50]

所有大于25的元素的索引:
(array([0, 1, 4]),)

所有大于 25 的元素:
[90 80 50] 

numpy.extract() 函数

NumPy extract() 函数返回满足某些条件的数组元素。如果条件是布尔值,则该函数相当于arr[条件]。

语法

numpy.extract(condition, arr) 

参数

condition必填。 指定一个数组,其非零或 True 条目指示要提取的 arr 元素。
arr必填。 指定与条件大小相同的数组。

示例:

在下面的示例中,extract()函数用于根据给定条件从数组中提取元素。

import numpy as np

Arr = np.arange(12).reshape((3, 4))

#显示数组
print("原始数组:")
print(Arr)

#定义条件
condition = np.mod(Arr, 3) == 0
print("\nCondition is:")
print(condition)

#对数组应用条件
print("\n根据条件提取元素:")
print(np.extract(condition, Arr))
输出上述代码将是:
原始数组:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

Condition is:
[[ True False False  True]
 [False False  True False]
 [False  True False False]]

根据条件提取元素:
[0 3 6 9]