Skip to content

Fancy Indexing

Fancy indexing selects elements using arrays of indices instead of scalars or slices.

1D Fancy Indexing

Select multiple elements by passing a list or array of indices.

1. List of Indices

import numpy as np

def main():
    a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    b = np.array(a)
    print(f"{b[[0, 1, 3]] = }")

if __name__ == "__main__":
    main()

Output:

b[[0, 1, 3]] = array([0, 1, 3])

2. Array of Indices

import numpy as np

def main():
    a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    b = np.array(a)
    print(f"{b[np.array([0, 1, 3])] = }")

if __name__ == "__main__":
    main()

Output:

b[np.array([0, 1, 3])] = array([0, 1, 3])

2D Fancy Indexing

Select multiple rows from a 2D array.

1. Row Selection

import numpy as np

def main():
    a = [[0, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]]
    b = np.array(a)
    print(f"{b[[0, 1, 3]] = }")

if __name__ == "__main__":
    main()

Output:

b[[0, 1, 3]] = array([[0, 1, 2],
                      [1, 2, 3],
                      [3, 4, 5]])

2. With np.array

import numpy as np

def main():
    a = [[0, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]]
    b = np.array(a)
    print(f"{b[np.array([0, 1, 3])] = }")

if __name__ == "__main__":
    main()

Output:

b[np.array([0, 1, 3])] = array([[0, 1, 2],
                                [1, 2, 3],
                                [3, 4, 5]])

Multi-Axis Fancy

Index both rows and columns simultaneously.

1. Paired Indices

import numpy as np

def main():
    a = [[0, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]]
    b = np.array(a)
    print(f"{b[[0, 1, 3], [0, 0, -1]] = }")

if __name__ == "__main__":
    main()

Output:

b[[0, 1, 3], [0, 0, -1]] = array([0, 1, 6])

2. How It Works

Pairs (row[i], col[i]) are selected: (0,0), (1,0), (3,-1).

3. With np.array

import numpy as np

def main():
    a = [[0, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]]
    b = np.array(a)
    print(f"{b[np.array([0, 1, 3]), np.array([0, 0, -1])] = }")

if __name__ == "__main__":
    main()

Output:

b[np.array([0, 1, 3]), np.array([0, 0, -1])] = array([0, 1, 6])

Boolean Masking

Select elements where a condition is True.

1. Create Mask

import numpy as np

arr = np.array([10, 20, 30, 40, 50])
mask = arr > 20
print(f"{mask = }")
print(f"{arr[mask] = }")

Output:

mask = array([False, False,  True,  True,  True])
arr[mask] = array([30, 40, 50])

2. Inline Condition

import numpy as np

arr = np.array([10, 20, 30, 40, 50])
print(f"{arr[arr > 20] = }")

Output:

arr[arr > 20] = array([30, 40, 50])

Use Cases

Fancy indexing enables expressive data selection.

1. Data Filtering

Select rows matching specific criteria from datasets.

2. Reordering

Rearrange array elements in arbitrary order.

3. Sampling

Select random subsets using random index arrays.