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



NumPy 提供了各种用于对数组中的元素进行排序、搜索和计数的函数。这些函数对于数据操作和分析非常有用。

NumPy 提供了几种排序算法,每种算法都有其自身的特点。以下是三种常见排序算法的比较:

kind 速度 最坏情况 工作空间 稳定性
'quicksort' 1 O(n^2) 0
'mergesort' 2 O(n*log(n)) ~n/2
'heapsort' 3 O(n*log(n)) 0

numpy.sort() 函数

sort() 函数返回输入数组的排序副本。它可以沿任何指定的轴对数组进行排序,并支持不同的排序算法。以下是语法:

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

其中,

序号 参数和描述
1

a

要排序的数组

2

axis

要排序的数组的轴。如果为 None,则数组将被展平,并在最后一个轴上排序

3

kind

默认为 quicksort

4

order

如果数组包含字段,则要排序的字段的顺序

示例

在以下示例中,我们分别使用默认方式和沿特定轴对二维 NumPy 数组进行排序。我们还演示了如何根据特定字段(例如“name”)对结构化数组进行排序:

import numpy as np  

# Create a 2D array
a = np.array([[3, 7], [9, 1]])

print("Our array is:",a)

# Default sort
print("Applying sort() function:",np.sort(a))

# Sort along axis 0
print("Sort along axis 0:",np.sort(a, axis=0))

# Order parameter in sort function
dt = np.dtype([('name', 'S10'), ('age', int)])
a = np.array([("raju", 21), ("anil", 25), ("ravi", 17), ("amar", 27)], dtype=dt)

print("Our array is:",a)

print("Order by name:",np.sort(a, order='name'))

它将产生以下输出:

Our array is:
[[3 7]
 [9 1]]

Applying sort() function:
[[3 7]
 [1 9]]

Sort along axis 0:
[[3 1]
 [9 7]]

Our array is:
[('raju', 21) ('anil', 25) ('ravi', 17) ('amar', 27)]

Order by name:
[('amar', 27) ('anil', 25) ('raju', 21) ('ravi', 17)]

numpy.argsort() 函数

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

示例

在此示例中,我们使用 argsort() 函数检索索引,即排序元素在原始数组中的位置。使用这些索引,您可以重建排序数组:

import numpy as np 

# Create an array
x = np.array([3, 1, 2])

print("Our array is:",x)

# Get indices that would sort the array
y = np.argsort(x)

print("Applying argsort() to x:",y)

# Reconstruct the sorted array using the indices
print("Reconstruct original array in sorted order:",x[y])

# Reconstruct the original array using a loop
print("Reconstruct the original array using loop:")
for i in y:
   print(x[i], end=' ')

它将产生以下输出:

Our array is:
[3 1 2]

Applying argsort() to x:
[1 2 0]

Reconstruct original array in sorted order:
[1 2 3]

Reconstruct the original array using loop:
1 2 3

numpy.lexsort() 函数

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

示例

在此示例中,我们使用 np.lexsort() 函数根据多个键对数据集进行排序,其中最后一个键“nm”是主要排序标准。然后使用排序索引通过组合名称和相应的字段来显示排序数据:

import numpy as np 

# Define keys
nm = ('raju', 'anil', 'ravi', 'amar') 
dv = ('f.y.', 's.y.', 's.y.', 'f.y.') 

# Get indices for sorted order
ind = np.lexsort((dv, nm))

print("Applying lexsort() function:",ind)

# Use indices to get sorted data
print("Use this index to get sorted data:",[nm[i] + ", " + dv[i] for i in ind]) 

它将产生以下输出:

Applying lexsort() function:
[3 1 0 2]

Use this index to get sorted data:
['amar, f.y.', 'anil, s.y.', 'raju, f.y.', 'ravi, s.y.']
NumPy 提供了用于查找最大值、最小值和非零元素以及满足条件的元素的索引的函数。

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

NumPy argmax() 和 argmin() 函数分别返回沿给定轴的最大和最小元素的索引。

示例

在此示例中,我们使用 np.argmax() 和 np.argmin() 函数查找二维数组中最大值和最小值的索引,包括展平数组和沿特定轴的情况:

import numpy as np 

# Create a 2D array
a = np.array([[30, 40, 70], [80, 20, 10], [50, 90, 60]])

print("Our array is:",a)

# Apply argmax() function
print("Applying argmax() function:",np.argmax(a))

# Index of maximum number in flattened array
print("Index of maximum number in flattened array:",a.flatten())

# Array containing indices of maximum along axis 0
print("Array containing indices of maximum along axis 0:")
maxindex = np.argmax(a, axis=0)
print(maxindex)


# Array containing indices of maximum along axis 1
print("Array containing indices of maximum along axis 1:")
maxindex = np.argmax(a, axis=1)
print(maxindex)

# Apply argmin() function
print("Applying argmin() function:")
minindex = np.argmin(a)
print(minindex)

# Flattened array
print("Flattened array:",a.flatten()[minindex])

# Flattened array along axis 0
print("Flattened array along axis 0:")
minindex = np.argmin(a, axis=0)
print(minindex)

# Flattened array along axis 1
print("Flattened array along axis 1:")
minindex = np.argmin(a, axis=1)
print(minindex)

输出包括这些极值的索引,演示了如何在数组中访问和解释这些位置:

Our array is:
[[30 40 70]
 [80 20 10]
 [50 90 60]]

Applying argmax() function:
7

Index of maximum number in flattened array
[30 40 70 80 20 10 50 90 60]

Array containing indices of maximum along axis 0:
[1 2 0]

Array containing indices of maximum along axis 1:
[2 0 1]

Applying argmin() function:
5

Flattened array:
10

Flattened array along axis 0:
[0 1 1]

Flattened array along axis 1:
[0 2 0]

numpy.nonzero() 函数

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

示例

在下面的示例中,我们使用 nonzero() 函数检索数组“a”中非零元素的索引:

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

print ('Our array is:',a)
print ('Applying nonzero() function:',np.nonzero (a))

它将产生以下输出:

Our array is:
[[30 40 0]
 [ 0 20 10]
 [50 0 60]]

Applying nonzero() function:
(array([0, 0, 1, 1, 2, 2]), array([0, 1, 1, 2, 0, 2]))

numpy.where() 函数

where() 函数返回输入数组中满足给定条件的元素的索引,如下面的示例所示:

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

print ('Our array is:',x)  

print ('Indices of elements > 3')
y = np.where(x > 3) 
print (y)  

print ('Use these indices to get elements satisfying the condition',x[y])

它将产生以下输出:

Our array is:
[[ 0. 1. 2.]
 [ 3. 4. 5.]
 [ 6. 7. 8.]]

Indices of elements > 3
(array([1, 1, 2, 2, 2]), array([1, 2, 0, 1, 2]))

Use these indices to get elements satisfying the condition
[ 4. 5. 6. 7. 8.]

numpy.extract() 函数

extract() 函数返回满足任何条件的元素,如下面的示例所示:

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

print ('Our array is:',x)  

# define a condition 
condition = np.mod(x,2) == 0 

print ('Element-wise value of condition',condition)

print ('Extract elements using condition',np.extract(condition, x))

它将产生以下输出:

Our array is:
[[ 0. 1. 2.]
 [ 3. 4. 5.]
 [ 6. 7. 8.]]

Element-wise value of condition
[[ True False True]
 [False True False]
 [ True False True]]

Extract elements using condition
[ 0. 2. 4. 6. 8.]
广告