Skip to main content

Python NumPy: How to Get the Indices of a Sorted Array Using NumPy

When sorting data, you often need to know where each element would end up after sorting - not just the sorted values themselves. NumPy's np.argsort() function returns the indices that would sort an array, which is essential for tasks like ranking, reordering related data, and finding the positions of the smallest or largest elements.

In this guide, we'll explain how argsort() works and show practical use cases.

Quick Answer

import numpy as np

arr = np.array([30, 10, 50, 20, 40])
sorted_indices = np.argsort(arr)
print(sorted_indices)

Output:

[1 3 0 4 2]

This means: the smallest element is at index 1 (value 10), the next smallest is at index 3 (value 20), and so on.

How np.argsort() Works

np.argsort() returns an array of indices that tells you the order in which elements should be arranged to sort the array:

import numpy as np

arr = np.array([30, 10, 50, 20, 40])
indices = np.argsort(arr)

print(f"Original: {arr}")
print(f"Sorted indices: {indices}")
print(f"Sorted values: {arr[indices]}") # Use indices to get sorted array

Output:

Original:       [30 10 50 20 40]
Sorted indices: [1 3 0 4 2]
Sorted values: [10 20 30 40 50]

The key insight: arr[np.argsort(arr)] gives you the sorted array.

Syntax

numpy.argsort(a, axis=-1, kind=None, order=None)
ParameterDescriptionDefault
aInput arrayRequired
axisAxis along which to sort-1 (last axis)
kindSorting algorithm: 'quicksort', 'mergesort', 'heapsort', 'stable''quicksort'
orderField to sort by (for structured arrays)None

Returns: An array of indices with the same shape as the input.

Sorting in Descending Order

np.argsort() sorts in ascending order by default. To get descending order, reverse the result:

import numpy as np

arr = np.array([30, 10, 50, 20, 40])

# Ascending order indices
asc = np.argsort(arr)
print(f"Ascending: {asc}{arr[asc]}")

# Descending order indices
desc = np.argsort(arr)[::-1]
print(f"Descending: {desc}{arr[desc]}")

Output:

Ascending:  [1 3 0 4 2]  → [10 20 30 40 50]
Descending: [2 4 0 3 1] → [50 40 30 20 10]

Alternatively, negate the array before sorting:

desc = np.argsort(-arr)
print(f"Descending: {desc}{arr[desc]}")

Sorting 2D Arrays

Along Columns (axis=0)

Sorts each column independently and returns the row indices that sort each column:

import numpy as np

arr = np.array([
[3, 1, 2],
[1, 3, 1],
[2, 2, 3]
])

indices = np.argsort(arr, axis=0)
print("Sorted indices along axis=0 (columns):")
print(indices)

Output:

Sorted indices along axis=0 (columns):
[[1 0 1]
[2 2 0]
[0 1 2]]

For the first column [3, 1, 2]: smallest is at row 1 (value 1), then row 2 (value 2), then row 0 (value 3).

Along Rows (axis=1)

Sorts each row independently and returns the column indices that sort each row:

import numpy as np

arr = np.array([
[3, 1, 2],
[1, 3, 1],
[2, 2, 3]
])

indices = np.argsort(arr, axis=1)
print("Sorted indices along axis=1 (rows):")
print(indices)

Output:

Sorted indices along axis=1 (rows):
[[1 2 0]
[0 2 1]
[0 1 2]]

For the first row [3, 1, 2]: smallest is at column 1 (value 1), then column 2 (value 2), then column 0 (value 3).

Practical Use Cases

Finding the Top N Elements

Get the indices of the 3 largest elements:

import numpy as np

scores = np.array([85, 92, 78, 95, 88, 73, 91])
names = np.array(['Alice', 'Bob', 'Carol', 'Dave', 'Eve', 'Frank', 'Grace'])

# Indices of top 3 scores
top3_indices = np.argsort(scores)[-3:][::-1]

print("Top 3 scorers:")
for i in top3_indices:
print(f" {names[i]}: {scores[i]}")

Output:

Top 3 scorers:
Dave: 95
Bob: 92
Grace: 91

Ranking Elements

Convert sorted indices into ranks:

import numpy as np

scores = np.array([85, 92, 78, 95, 88])

# Get ranks (1-based, where 1 = highest)
ranks = np.empty_like(scores)
sorted_indices = np.argsort(scores)[::-1] # Descending
ranks[sorted_indices] = np.arange(1, len(scores) + 1)

print(f"Scores: {scores}")
print(f"Ranks: {ranks}")

Output:

Scores: [85 92 78 95 88]
Ranks: [4 2 5 1 3]

Sort multiple arrays based on the order of one:

import numpy as np

names = np.array(['Charlie', 'Alice', 'Bob', 'Dave'])
ages = np.array([30, 25, 28, 22])

# Sort both arrays by age
order = np.argsort(ages)
print("Sorted by age:")
for name, age in zip(names[order], ages[order]):
print(f" {name}: {age}")

Output:

Sorted by age:
Dave: 22
Alice: 25
Bob: 28
Charlie: 30

Sorting Strings

import numpy as np

words = np.array(['banana', 'apple', 'cherry', 'date'])
sorted_indices = np.argsort(words)

print(f"Original: {words}")
print(f"Sorted: {words[sorted_indices]}")

Output:

Original: ['banana' 'apple' 'cherry' 'date']
Sorted: ['apple' 'banana' 'cherry' 'date']

Choosing a Sorting Algorithm

Algorithmkind=Stable?Best For
Quicksort'quicksort'General use (default, fastest average)
Mergesort'mergesort'When stability matters
Heapsort'heapsort'Memory-constrained scenarios
Stable'stable'Alias for mergesort/timsort

Stable sorting preserves the relative order of equal elements:

import numpy as np

arr = np.array([3, 1, 2, 1, 3])

unstable = np.argsort(arr, kind='quicksort')
stable = np.argsort(arr, kind='stable')

print(f"Quicksort: {unstable}")
print(f"Stable: {stable}")

Output:

Quicksort: [1 3 2 0 4]
Stable: [1 3 2 0 4]

argsort() vs sort() vs sorted()

FunctionReturnsModifies Original
np.argsort(arr)Array of indices
np.sort(arr)Sorted copy of the array
arr.sort()None (sorts in place)
import numpy as np

arr = np.array([30, 10, 50])

print(f"argsort: {np.argsort(arr)}") # [1 0 2] (indices)
print(f"sort: {np.sort(arr)}") # [10 30 50] (sorted values)

Output:

argsort: [1 0 2]
sort: [10 30 50]

Conclusion

np.argsort() returns the indices that would sort an array, making it invaluable when you need to track original positions, sort related data together, find top/bottom N elements, or compute rankings.

For descending order, reverse the result with [::-1] or negate the array. It works on arrays of any dimension using the axis parameter and supports multiple sorting algorithms via the kind parameter.

Use 'stable' when the relative order of equal elements matters.