🔍 NumPy Indexing, Slicing & Iterating

Last Updated: 09 Nov 2025


In NumPy, indexing means selecting specific elements, and slicing means selecting a range (part) of elements.

🗣 Hinglish Tip: “Indexing = ek element lena, Slicing = ek se zyada ek range lena!”


Indexing in 1D Arrays

import numpy as np

arr = np.array([10, 20, 30, 40, 50])
print("Array:", arr)

print("First element:", arr[0])
print("Last element:", arr[-1])
print("Middle element:", arr[2])
print(arr[-2])      # 2nd last element

Indexing in 2D Arrays

You can access using row, column index.

import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr)

print("Element at [0,0]:", arr[0, 0])
print("Element at [1,2]:", arr[1, 2])
print("First row:", arr[0])
print("Second column:", arr[:, 1])

🗣 Hinglish Tip:arr[row, column] likh ke access karte hain — bilkul matrix jaisa!


Slicing in 1D Arrays

import numpy as np
arr = np.array([10, 20, 30, 40, 50, 60])
print(arr[1:4])     # From index 1 to 3
print(arr[:3])      # From start to index 2
print(arr[3:])      # From index 3 to end
print(arr[::2])     # Every 2nd element
print(arr[-4:-1])   # Slice from 2nd to last

Slicing in 2D Arrays

arr = np.array([[10,20,30,40],
                [50,60,70,80],
                [90,100,110,120]])

print(arr[0:2, 1:3])   # rows 0-1, cols 1-2
print(arr[:, 2])       # all rows, only 3rd column
print(arr[1, :])       # 2nd row, all columns

🧠 Pattern:arr[row_start:row_end, col_start:col_end]


Iterating over Arrays

1D Array

arr = np.array([10, 20, 30])
for x in arr:
    print(x)

2D Array

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

for row in arr:
    print("Row:", row)

flat

  • turns any array (2D, 3D, 5D…) into a 1D iterator.
  • You can loop through it, read values, or even change them.
  • It always follows the order the data is stored in memory (usually row-by-row).
a = np.array([[10, 20, 30],
              [40, 50, 60],
              [70, 80, 90]])

print("All values one by one:")
for value in a.flat:
    print(value, end=' ')
# Output: 10 20 30 40 50 60 70 80 90

print("Change values directly:")
a.flat[2] = 999       # 3rd element (0-based)
a.flat[5] = 555       # 6th element
a.flat[-1] = 111      # last element
a.flat[::2] = 0       # make every second element zero
a.flat[[1,3,5]] = 7   # change specific positions
print(a)

np.nditer()

  • best way to iterate over arrays (2D, 3D, 5D...)
  • Better performance than for loops and faster than flat
arr = np.array([[10,20],[30,40],[50,60]])

# READ ONLY
for x in np.nditer(arr):
    print(x)

# Index and value

for value in np.nditer(arr, flags=['multi_index']):
    print(f"Position {value} is at index {np.nditer.multi_index}")

# VALUE CHANGES
for x in np.nditer(arr, op_flags=['readwrite']):
    x[...] = x * 10        # [...] means "write back to same place"

print(arr)
# Two arrays iteration

a = np.array([[10, 20, 30],
              [40, 50, 60],
              [70, 80, 90]])

b = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

for x, y in np.nditer([a, b]):
    print(x, y)

🗣 Hinglish Tip:“nditer() ka matlab hai ‘n-dimensional iterator’ — easy tarike se har element access karne ke liye.