a.sort, sorted(a), np_argsort(a) and np.lexsort(b, a) in Python
以特定顺序对数据元素进行排序是经常需要的操作。为了对数组中的元素进行排序,python使用名为sorted()和array.sort()的函数。
排序(数组)
此函数返回排序后的数组,而不修改原始数组。
1 2 3 4 5 6 7 8 | a = [9,5,3,1,12,6] b = sorted([9,5,3,1,12,6]) print"Sorted Array : ", print (b) print"Original Array : ", print (a) |
运行上面的代码将为我们提供以下结果:
1 2 3 4 | Sorted Array : [1, 3, 5, 6, 9, 12] Original Array : [9, 5, 3, 1, 12, 6] |
list.sort()
sort函数通过对提供的数组进行就地修改来返回已排序的数组。因此,原始数组将被修改,如下例所示。
1 2 3 4 5 6 7 8 | a = [9,5,3,1,12,6] print"Original Array : ", print (a) print"Sorted Array : ", a.sort() print (a) |
运行上面的代码将为我们提供以下结果:
1 2 3 4 | 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函数,该函数为我们提供排序数组的索引,结果也是数组。
1 2 3 4 5 6 7 8 9 10 11 12 | 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" " # Print the indices of sorted elements s = np.argsort(x) print(s) |
运行上面的代码将为我们提供以下结果:
1 2 3 4 5 | [ 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列的数组。应用lexsort()函数首先按A列然后按列进行排序B,我们得到排序结果为一个数组,其中包含A列中元素的索引。
1 2 3 4 5 6 7 8 9 | 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] |
运行上面的代码将为我们提供以下结果:
1 2 | [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。