IndexError: Tensor index out of range

Loading

When working with tensors in frameworks like PyTorch or TensorFlow, you might encounter the error:

IndexError: index out of range in self

This error happens when you try to access an index that does not exist in a tensor.


1. Understanding Indexing in Tensors

A tensor is a multi-dimensional array, similar to NumPy arrays. Indexing in tensors follows zero-based indexing like Python lists and NumPy arrays.

  • The first element is at index 0
  • The last element is at index size - 1

For a tensor of shape (3, 4):

[[10, 11, 12, 13],
[20, 21, 22, 23],
[30, 31, 32, 33]]
  • Valid indices:
    • tensor[0, 2] → Accesses value 12
    • tensor[2, 3] → Accesses value 33
  • Invalid indices:
    • tensor[3, 1] (Row index 3 is out of bounds)
    • tensor[1, 5] (Column index 5 is out of bounds)

2. Common Causes of Tensor Index Errors

1️⃣ Accessing an Index Greater than the Tensor’s Shape

Incorrect Code:

import torch

tensor = torch.tensor([[1, 2, 3], [4, 5, 6]]) # Shape (2,3)

print(tensor[2, 1]) # IndexError: Row index 2 is out of range

Output:

IndexError: index 2 is out of bounds for dimension 0 with size 2

Problem:

  • Tensor has 2 rows (0 and 1)
  • Trying to access row index 2, which does not exist.

Fix: Use a Valid Index

print(tensor[1, 1])  #  Accesses index (1,1) -> 5

2️⃣ Using a Negative Index Beyond the Lower Bound

Negative indexing allows access from the end, but exceeding the limit causes an error.

Incorrect Code:

import torch

tensor = torch.tensor([[10, 20, 30], [40, 50, 60]]) # Shape (2,3)

print(tensor[-3, 0]) # IndexError: -3 is out of bounds

Output:

IndexError: index -3 is out of bounds for dimension 0 with size 2

Problem:

  • Valid negative row indices: -1 (last row), -2 (first row)
  • Invalid index: -3 (out of bounds)

Fix: Use a Valid Negative Index

print(tensor[-2, 0])  #  Access first row (same as tensor[0, 0])

3️⃣ Slicing Beyond Tensor Shape

Slicing allows retrieving sub-tensors, but slicing beyond limits causes errors.

Incorrect Code:

import torch

tensor = torch.tensor([[1, 2, 3], [4, 5, 6]])

print(tensor[:, 5]) # IndexError: Column 5 is out of range

Output:

IndexError: index 5 is out of bounds for dimension 1 with size 3

Problem:

  • Tensor has 3 columns (0, 1, 2), but trying to access column 5.

Fix: Use a Valid Column Index

print(tensor[:, 2])  #  Access third column

4️⃣ Incorrect Tensor Reshaping

Incorrect Code:

import torch

tensor = torch.arange(6).reshape(3, 2) # Creates (3,2) tensor

print(tensor[1, 2]) # IndexError: Column index 2 does not exist

Output:

IndexError: index 2 is out of bounds for dimension 1 with size 2

Problem:

  • Tensor is (3 × 2)
  • Trying to access a third column (index 2), but it has only 2 columns (0 and 1).

Fix: Check Tensor Shape Before Indexing

print(tensor.shape)  #  Output: torch.Size([3, 2])
print(tensor[1, 1]) # Valid index

5️⃣ Iterating Incorrectly Over a Tensor

🔴 Incorrect Code:

import torch

tensor = torch.tensor([1, 2, 3])

for i in range(5): # Looping past the tensor size
print(tensor[i])

Output:

IndexError: index 3 is out of bounds for dimension 0 with size 3

Problem:

  • Tensor has 3 elements (0, 1, 2).
  • Loop runs until i = 4, causing an out-of-range error.

Fix: Iterate Using len()

for i in range(len(tensor)):  #  Loop only within valid indices
print(tensor[i])

3. Best Practices to Avoid Index Errors

1. Always Print Tensor Shape

Before indexing, check the tensor’s shape using .shape:

import torch

tensor = torch.rand(4, 5) # Shape (4,5)
print(tensor.shape) # Output: torch.Size([4, 5])

This helps ensure that the indices used are within range.


2. Use if Checks Before Indexing

index = 3
if index < tensor.shape[0]: # Check before accessing
print(tensor[index])
else:
print("Index out of range!")

3. Use .get() for Safe Access (If Using Dictionaries)

tensor_dict = {0: torch.tensor([1, 2, 3])}
print(tensor_dict.get(5, "Index not found")) # Prevents errors

4. Use .clamp() to Keep Indices in Range

If you still need to access out-of-bound indices, clamp values within limits:

index = torch.tensor([-1, 5, 3])
clamped_index = index.clamp(0, tensor.shape[0] - 1)
print(tensor[clamped_index])

This prevents out-of-range indexing errors.


4. Summary of Key Mistakes & Fixes

MistakeProblemFix
Accessing an index beyond tensor sizetensor[2,1] when shape is (2,3)Use tensor[1,1]
Using negative indices beyond lower boundtensor[-3,0] when shape is (2,3)Use valid negative indices (-2, -1)
Slicing beyond shapetensor[:, 5] when shape is (2,3)Use valid column indices (0 to 2)
Incorrect reshapingtensor[1,2] when shape is (3,2)Use .shape before indexing
Looping beyond tensor sizefor i in range(5) on tensor of size 3Use for i in range(len(tensor))

Leave a Reply

Your email address will not be published. Required fields are marked *