When working with NumPy arrays, you might try to find the position of an element using the .index() method - the same way you would with a Python list. However, NumPy arrays don't have an index() method, and attempting to use it raises AttributeError: 'numpy.ndarray' object has no attribute 'index'.
In this guide, we'll explain why this happens and show you multiple alternatives for finding element positions in NumPy arrays.
Why Does This Error Occur?
Python lists have a built-in .index() method that returns the position of the first occurrence of a value:
my_list = [10, 20, 30, 40]
print(my_list.index(30)) # Output: 2NumPy arrays, however, are a different data type (numpy.ndarray) with their own set of methods - and .index() is not one of them.
❌ Wrong - Using .index() on a NumPy array:
import numpy as np
arr = np.array([10, 20, 30, 40, 50])
print(arr.index(30))Output:
AttributeError: 'numpy.ndarray' object has no attribute 'index'Solutions
Solution 1: Use np.where() (Recommended)
np.where() is the most common and versatile replacement. It returns the indices of all elements that match a condition:
import numpy as np
arr = np.array([10, 20, 30, 40, 50])
indices = np.where(arr == 30)
print(indices)Output:
(array([2]),)To get just the index as an integer:
index = np.where(arr == 30)[0][0]
print(index)Output:
2When the Element Appears Multiple Times
np.where() returns all matching indices, making it more powerful than list's .index() (which only returns the first):
import numpy as np
arr = np.array([5, 10, 5, 20, 5, 30])
indices = np.where(arr == 5)
print(indices)Output:
(array([0, 2, 4]),)When the Element Doesn't Exist
If the element is not found, np.where() returns an empty array - it doesn't raise an error:
import numpy as np
arr = np.array([10, 20, 30])
indices = np.where(arr == 99)
print(indices)
print(f"Found: {len(indices[0]) > 0}")Output:
(array([], dtype=int64),)
Found: FalseSolution 2: Use np.argwhere() for Cleaner Output
np.argwhere() returns the indices in a more readable array format, which is especially useful for multi-dimensional arrays:
import numpy as np
arr = np.array([10, 20, 30, 20, 40])
indices = np.argwhere(arr == 20)
print(indices)Output:
[[1]
[3]]For a 2D array:
import numpy as np
matrix = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
indices = np.argwhere(matrix == 5)
print(indices) # Row 1, Column 1Output:
[[1 1]]Solution 3: Use np.searchsorted() for Sorted Arrays
If your array is sorted, np.searchsorted() is the fastest option - it uses binary search (O(log n) instead of O(n)):
import numpy as np
arr = np.array([10, 20, 30, 40, 50]) # Must be sorted
index = np.searchsorted(arr, 30)
print(index)Output:
2Solution 4: Convert to a List (Simple but Less Efficient)
If you only need to find a single element and performance isn't critical, convert the array to a list and use .index():
import numpy as np
arr = np.array([10, 20, 30, 40, 50])
index = arr.tolist().index(30)
print(index)Output:
2Solution 5: Use np.nonzero() with a Condition
np.nonzero() returns indices of elements that are non-zero. Combined with a boolean condition, it works like np.where():
import numpy as np
arr = np.array([10, 20, 30, 40, 50])
indices = np.nonzero(arr == 30)
print(indices)Output:
(array([2]),)Practical Examples
Finding the Index of the Maximum or Minimum Value
import numpy as np
scores = np.array([85, 92, 78, 95, 88])
max_index = np.argmax(scores)
min_index = np.argmin(scores)
print(f"Highest score: {scores[max_index]} at index {max_index}")
print(f"Lowest score: {scores[min_index]} at index {min_index}")Output:
Highest score: 95 at index 3
Lowest score: 78 at index 2Finding Indices Where a Condition Is Met
import numpy as np
temperatures = np.array([72, 85, 90, 68, 95, 88, 70])
hot_days = np.where(temperatures > 85)[0]
print(f"Hot day indices: {hot_days}")
print(f"Hot day temperatures: {temperatures[hot_days]}")Output:
Hot day indices: [2 4 5]
Hot day temperatures: [90 95 88]Safe Index Lookup with a Fallback
import numpy as np
def find_index(arr, value, default=-1):
"""Find the first index of a value in a NumPy array."""
indices = np.where(arr == value)[0]
if len(indices) > 0:
return indices[0]
return default
arr = np.array([10, 20, 30, 40])
print(find_index(arr, 30)) # 2
print(find_index(arr, 99)) # -1 (not found)Output:
2
-1Method Comparison
| Method | Returns | Multiple Matches | Element Not Found | Performance | Best For |
|---|---|---|---|---|---|
np.where() |
Tuple of arrays | ✅ All indices | Empty array | O(n) | General use |
np.argwhere() |
2D array of indices | ✅ All indices | Empty array | O(n) | Multi-dimensional arrays |
np.searchsorted() |
Single index | ❌ First only | Insertion point | O(log n) | Sorted arrays |
.tolist().index() |
Single integer | ❌ First only | Raises ValueError |
O(n) + copy | Quick scripts |
np.argmax() / np.argmin() |
Single index | ❌ First only | N/A | O(n) | Finding max/min position |
Conclusion
The AttributeError: 'numpy.ndarray' object has no attribute 'index' error occurs because NumPy arrays don't have a .index() method like Python lists do.
- The recommended replacement is
np.where(arr == value), which returns all matching indices and safely returns an empty array if the element isn't found. - For sorted arrays,
np.searchsorted()provides faster performance.
Avoid converting to a list with .tolist().index() for large arrays, as it's both slower and less flexible than NumPy's native solutions.