In this article we will discuss how to select elements from a 2D Numpy Array . Elements to select can be a an element only or single/multiple rows & columns or an another sub 2D array.

First of all, let’s import numpy module i.e.

`import numpy as np`

Now let’s create a 2d Numpy Array by passing a list of lists to numpy.array() i.e.
```# Create a 2D Numpy adArray with 3 rows & 3 columns | Matrix
nArr2D = np.array(([21, 22, 23], [11, 22, 33], [43, 77, 89]))
```

Contents of the 2D Numpy Array will be,
```[[21 22 23]
[11 22 33]
[43 77 89]]```

Now let’s see how to select elements from this 2D Numpy Array by index i.e.

## Select a single element from 2D Numpy Array by index

We can use [][] operator to select an element from Numpy Array i.e.

`ndArray[row_index][column_index]`

Example 1:

Select the element at row index 1 and column index 2.

```# Select element at row index 1 & column index 2
num = nArr2D

print('element at row index 1 & column index 2 is : ' , num)
```

Output:
`element at row index 1 & column index 2 is :  33`

Example 2:

Or we can pass the comma separated list of indices representing row index & column index too i.e.

```# Another way to select element at row index 1 & column index 2
num = nArr2D[1, 2]

print('element at row index 1 & column index 2 is : ', num)
```

Output:
`element at row index 1 & column index 2 is :  33`

## Select Rows by Index from a 2D Numpy Array

We can call [] operator to select a single or multiple row. To select a single row use,

`ndArray[row_index]`

It will return a complete row at given index.

To select multiple rows use,

`ndArray[start_index: end_index ,  :]`

It will return rows from start_index to end_index – 1 and will include all columns.

Let’s use this,

Contents of the 2D a Numpy Array nArr2D created above are,

```[[21 22 23]
[11 22 33]
[43 77 89]]```

Let’s select a row at index 2 i.e.
```# Select a Row at index 1
row = nArr2D

print('Contents of Row at Index 1 : ' , row)
```

Output:
`Contents of Row at Index 1 :  [11 22 33]`

Select multiple rows from index 1 to 2 i.e.
```# Select multiple rows from index 1 to 2
rows = nArr2D[1:3, :]

print('Rows from Index 1 to 2 :')
print(rows)```

Output:
```Rows from Index 1 to 2 :
[[11 22 33]
[43 77 89]]```

Select multiple rows from index 1 to last index
```# Select multiple rows from index 1 to last index
rows = nArr2D[1: , :]

print('Rows from Index 1 to last row :')
print(rows)```

Output:
```[[11 22 33]
[43 77 89]]```

## Select Columns by Index from a 2D Numpy Array

To select a single column use,

```ndArray[ : , column_index]
```

It will return a complete column at given index.

To select multiple columns use,

`ndArray[ : , start_index: end_index]`

It will return columns from start_index to end_index – 1.

Let’s use these,

Contents of the 2D Numpy Array nArr2D created above are,

```[[21 22 23]
[11 22 33]
[43 77 89]]
```

Select a column at index 1
```# Select a column at index 1
column = nArr2D[:, 1]

print('Contents of Column at Index 1 : ', column)
```

Output:
`Contents of Column at Index 1 :  [22 22 77]`

Select multiple columns from index 1 to 2
```# Select multiple columns from index 1 to 2
columns = nArr2D[: , 1:3]

print('Column from Index 1 to 2 :')
print(columns)
```

Output:
```Column from Index 1 to 2 :
[[22 23]
[22 33]
[77 89]]```

Select multiple columns from index 1 to last index
```# Select multiple columns from index 1 to last index
columns = nArr2D[:, 1:]
```

Output is same as above because there are only 3 columns 0,1,2. So 1 to last columns means columns at index 1 & 2.

## Select a Sub Matrix or 2d Numpy Array from another 2D Numpy Array

To select sub 2d Numpy Array we can pass the row & column index range in [] operator i.e.

`ndArray[start_row_index : end_row_index , start_column_index : end_column_index]`

It will return a sub 2D Numpy Array for given row and column range.

Let’s use these,

Contents of the 2D Numpy Array nArr2D created at start of article are,

```[[21 22 23]
[11 22 33]
[43 77 89]]
```

Select a sub 2D Numpy Array from row indices 1 to 2 & column indices 1 to 2
```# Select a sub 2D array from row indices 1 to 2 & column indices 1 to 2
sub2DArr = nArr2D[1:3, 1:3]

print('Sub 2d Array :')
print(sub2DArr)
```

Output:
```Sub 2d Array :
[[22 33]
[77 89]]```

## Selected Row or Column or Sub Array is View only

Contents of the Numpy Array selected using [] operator returns a View only i.e. any modification in returned sub array will be reflected in original Numpy Array .
Let’s check this,

Contents of the 2D Numpy Array nArr2D created at start are,

```[[21 22 23]
[11 22 33]
[43 77 89]]```

Select a row at index 1 from 2D array i.e.
```# Select row at index 1 from 2D array
row = nArr2D```

Contents of row :
`[11 22 33]`

Now modify the contents of row i.e.
```# Change all the elements in selected sub array to 100
row[:] = 100```

New contents of the row will be
`[100 100 100]`

Modification in sub array will be reflected in main Numpy Array too. Updated Contents of the 2D Numpy Array nArr2D are,
```[[ 21  22  23]
[100 100 100]
[ 43  77  89]]```

## Get a copy of 2D Sub Array from 2D Numpy Array using ndarray.copy()

to the copy instead of view in sub array use copy() function.
Let’s check this,

Create a 2D Numpy adArray with3 rows & columns | Matrix

```# Create a 2D Numpy adArray with3 rows & columns | Matrix
nArr2D = np.array(([21, 22, 23], [11, 22, 33], [43, 77, 89]))
```

Content of nArr2D is,
```[[ 21  22  23]
[100 100 100]
[ 43  77  89]]```

Select a copy of row at index 1 from 2D array and set all the elements in selected sub array to 100
```# Select a copy of row at index 1 from 2D array
row = nArr2D.copy()

# Set all the elements in selected sub array to 100
row[:] = 100```

Here, sub array is a copy of original array so, modifying it will not affect the original Numpy Array
Contents of the modified sub array row is,
`[100 100 100]`

Contents of the original Numpy Array is,
```[[21 22 23]
[11 22 33]
[43 77 89]]```

Complete example is as follows,
```import numpy as np

def main():
# Create a 2D Numpy adArray with 3 rows & 3 columns | Matrix
nArr2D = np.array(([21, 22, 23], [11, 22, 33], [43, 77, 89]))

print('Contents of 2D Array : ')
print(nArr2D)

print('*** Select an element by index from a 2D ndArray')

# Select element at row index 1 & column index 2
num = nArr2D

print('element at row index 1 & column index 2 is : ' , num)

# Another way to select element at row index 1 & column index 2
num = nArr2D[1, 2]

print('element at row index 1 & column index 2 is : ', num)

print('*** Select Rows by Index from a 2D ndArray ***')

# Select a Row at index 1
row = nArr2D

print('Contents of Row at Index 1 : ' , row)

# Select multiple rows from index 1 to 2
rows = nArr2D[1:3, :]

print('Rows from Index 1 to 2 :')
print(rows)

# Select multiple rows from index 1 to last index
rows = nArr2D[1: , :]
print('Rows from Index 1 to last row :')
print(rows)

print('*** Select Columns by Index from a 2D ndArray ***')

# Select a column at index 1
column = nArr2D[:, 1]

print('Contents of Column at Index 1 : ', column)

# Select multiple columns from index 1 to 2
columns = nArr2D[: , 1:3]

print('Column from Index 1 to 2 :')
print(columns)

# Select multiple columns from index 1 to last index
columns = nArr2D[:, 1:]

print('Column from Index 1 to last index :')
print(columns)

print('*** Select a Sub Matrix or 2d Array from another 2D ndArray ***')

print('Original ndArray')
print(nArr2D)

# Select a sub 2D array from row indices 1 to 2 & column indices 1 to 2
sub2DArr = nArr2D[1:3, 1:3]

print('Sub 2d Array :')
print(sub2DArr)

print('*** Sub Array is View only ***')

print('Original ndArray')
print(nArr2D)

# Select row at index 1 from 2D array
row = nArr2D

print('Contents of row / sub array')
print(row)

# Change all the elements in selected sub array to 100
row[:] = 100

# As sub array is a copy so, changes in it will be reflected in original array too

print('Contents of modified row / sub array')
print(row)
print('Original ndArray')
print(nArr2D)

print('*** Fetching a copy of 2D Sub Array from 2D ndArray ***')

# Create a 2D Numpy adArray with3 rows & columns | Matrix
nArr2D = np.array(([21, 22, 23], [11, 22, 33], [43, 77, 89]))

# Select a copy of row at index 1 from 2D array
row = nArr2D.copy()

# Set all the elements in selected sub array to 100
row[:] = 100

'''
Here sub array is a copy of original array so, modifying it will not affect the original ndArray
'''

print('Contents of modified row / sub array')
print(row)
print('Original ndArray')
print(nArr2D)

if __name__ == '__main__':
main()

```

Output:
```Contents of 2D Array :
[[21 22 23]
[11 22 33]
[43 77 89]]
*** Select an element by index from a 2D ndArray
element at row index 1 & column index 2 is :  33
element at row index 1 & column index 2 is :  33
*** Select Rows by Index from a 2D ndArray ***
Contents of Row at Index 1 :  [11 22 33]
Rows from Index 1 to 2 :
[[11 22 33]
[43 77 89]]
Rows from Index 1 to last row :
[[11 22 33]
[43 77 89]]
*** Select Columns by Index from a 2D ndArray ***
Contents of Column at Index 1 :  [22 22 77]
Column from Index 1 to 2 :
[[22 23]
[22 33]
[77 89]]
Column from Index 1 to last index :
[[22 23]
[22 33]
[77 89]]
*** Select a Sub Matrix or 2d Array from another 2D ndArray ***
Original ndArray
[[21 22 23]
[11 22 33]
[43 77 89]]
Sub 2d Array :
[[22 33]
[77 89]]
*** Sub Array is View only ***
Original ndArray
[[21 22 23]
[11 22 33]
[43 77 89]]
Contents of row / sub array
[11 22 33]
Contents of modified row / sub array
[100 100 100]
Original ndArray
[[ 21  22  23]
[100 100 100]
[ 43  77  89]]
*** Fetching a copy of 2D Sub Array from 2D ndArray ***
Contents of modified row / sub array
[100 100 100]
Original ndArray
[[21 22 23]
[11 22 33]
[43 77 89]]```