Python 中的 a.sort、sorted(a)、np.argsort(a) 和 np.lexsort(b, a)


按特定顺序排列数据元素是一种经常需要的操作。为了对数组中的元素进行排序,Python 使用名为 sorted() 和 array.sort() 的函数。

sorted(array)

此函数返回一个排序后的数组,而不会修改原始数组。

a = [9,5,3,1,12,6]
b = sorted([9,5,3,1,12,6])
print "Sorted Array :\n",
print (b)
print "Original Array :\n",
print (a)

运行上述代码,我们得到以下结果:

Sorted Array :
[1, 3, 5, 6, 9, 12]
Original Array :
[9, 5, 3, 1, 12, 6]

list.sort()

sort 函数通过对提供的数组进行就地修改来返回排序后的数组。因此,原始数组会像下面的例子中显示的那样被修改。

a = [9,5,3,1,12,6]
print "Original Array :\n",
print (a)
print "Sorted Array :\n",
a.sort()
print (a)

运行上述代码,我们得到以下结果:

Original Array :
[9, 5, 3, 1, 12, 6]
Sorted Array :
[1, 3, 5, 6, 9, 12]

因此,sorted() 函数比 sort() 函数慢,因为它会创建原始数组的副本,然后对其进行修改。

更复杂的排序需求可以使用 NumPy 来完成。NumPy 是一个 Python 库,广泛用于科学数据处理,因为它提供了许多高级功能。我们将在下面的示例中看到纯 Python 排序方法和 NumPy 排序方法。

numpy.argsort

NumPy 中的此函数返回排序数组的索引,而不是数组元素。在下面的示例中,我们获取数组,打印其元素以及每个元素的索引。然后我们应用 argsort 函数,它给我们排序数组的索引作为结果,结果也是一个数组。

import numpy as np
x = np.array([9,5,3,1,12,6])
print(x)

#Print the positions of elements
for i in range(len(x)):
print "[",i,"]",x[i],
print "\n"
# Print the indices of sorted elements
s = np.argsort(x)
print(s)

运行上述代码,我们得到以下结果:

[ 9 5 3 1 12 6]

[ 0 ] 9 [ 1 ] 5 [ 2 ] 3 [ 3 ] 1 [ 4 ] 12 [ 5 ] 6

[3 2 1 5 0 4]

numpy.lexsort

此函数用于使用多个排序键进行排序,涉及多个数组。例如,我们首先对 A 列中的数据进行排序,然后对 B 列中的值进行排序。在下面的示例中,我们获取两个数组分别表示 A 列和 B 列。对 A 列然后 B 列应用 lexsort() 函数进行排序后,我们得到排序结果,这是一个包含 A 列中元素索引的数组。

import numpy as np
colA = [2,5,1,8,1] # First column
colB = [9,0,3,2,0] # Second column
# Sort by ColA and then by colB
sorted_index = np.lexsort((colB,colA))
print(sorted_index)
#print the result showing the
#column values as pairs
print [(colA[i],colB[i]) for i in sorted_index]

运行上述代码,我们得到以下结果:

[4 2 0 1 3]
[(1, 0), (1, 3), (2, 9), (5, 0), (8, 2)]

您可以看到 colA 中的两个最小值是索引位置 2 和 4 处的 1 和 1。但是结果显示 4 和 2 为升序,因为 B 列中相应的值 0 和 3 也按升序排序,首先是 0 然后是 3,结果为 4 和 2。

更新于:2020年6月30日

560 次浏览

开启您的职业生涯

完成课程获得认证

开始学习
广告