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]