NumPy | argsort method
argsort(~) method returns the integer indices of the sorted copy of the input array.
The input array.
The axis along which to sort the input array. For 2D arrays, the allowed values are as follows:
Flattens the array and sorts it
axis=-1 which means that sorting is performed only on the last axis. For 2D arrays, this means that the default sorting behaviour is row-wise.
The sorting algorithm to use. Currently, Numpy offers the following choices:
Sorting algorithms that are "stable" retain the relative ordering of duplicate values. For instance, suppose you are sorting the array
[(2,3), (2,2), (4,5)] by the first element of each tuple. We have a duplicate value of 2 here, so stable sorting algorithms ensure that
(2,3) will always come before
(2,2) since that is how they are ordered originally. Unstable searches provide no guarantee that such ordering is retained.
The datatype determines whether mergesort or timsort is used
Despite the fact that you can specify either mergesort or timsort, Numpy will ultimately make its decision on the data-type of the array. There is currently no way of enforcing your choice of algorithm between the two.
Timsort offers the best performance for sorted or nearly sorted arrays
Timsort is the latest searching algorithm added to Numpy (version 1.17). Timsort is still nearly as efficient as mergesort for randomly arranged numbers.
The field to sort by. This is only applicable to structured arrays - see our example below for clarification.
A Numpy array containing the indices of the sorted copy of the input array.
Sorting one-dimensional arrays
x = np.array([7,5,8,6])np.sort(x)array([1, 3, 0, 2])
Sorting two-dimensional arrays
Suppose we have the following 2D array:
x = np.array([[7,5],[8,6]])xarray([[7, 5],[8, 6]])
Sorting the flattened array
np.argsort(x, axis=None)array([1, 3, 0, 2])
np.argsort(x) # or explicitly set axis=1array([[1, 0],[1, 0]])
np.argsort(x, axis=0)array([[0, 0],[1, 1]])
Specifying order for structured arrays
Suppose we have the following structured array:
dtype = [('name', 'S15'), ('age', int)]values = [('Bob', 35), ('Alex', 15),('Cathy', 24)]x = np.array(values, dtype)xarray([(b'Bob', 35), (b'Alex', 15), (b'Cathy', 24)],dtype=[('name', 'S15'), ('age', '<i8')])
x consists of three tuples, with the 1st element as the
name, and the 2nd element as the
To sort by
np.argsort(x, order="name")array([1, 0, 2])
The returned array here contains the original indices of the tuple with
Bob and then
To sort by
np.argsort(x, order="age")array([1, 2, 0])
The returned array here contains the original indices of the tuple with age 15, 24 and then 35.
You could also pass in an array of labels to sort by (e.g.
order=["name", "age"]), which would sort the array by
name first, and then by