# Inserting rows and columns into a table numpy

I would like to insert multiple rows and columns into a numpy array.

If I have a square array of length n_a, e.g.: n_a = 3

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

and I would like to get a new array with size n_b, which contains array a and zeros (or any other 1-d array of length n_b) on certain rows and columns with indices, e.g.

``````index = [1, 3]
```
```

so n_b = n_a + len(index). Then the new array is:

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

So my question is, how to do this efficiently, with the assumption that by bigger arrays n_a is much larger than len(index).

EDIT

The results for:

``````import numpy as np
import random

n_a = 5000
n_index = 100

a=np.random.rand(n_a, n_a)
index = random.sample(range(n_a), n_index)
```
```

Warren Weckesser's solution: 0.208 s

wim's solution: 0.980 s

Ashwini Chaudhary's solution: 0.955 s

Thank you to all!

Here's one way to do it. It has some overlap with @wim's answer, but it uses index broadcasting to copy `a` into `b` with a single assignment.

``````import numpy as np

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

index = [1, 3]
n_b = a.shape + len(index)

not_index = np.array([k for k in range(n_b) if k not in index])

b = np.zeros((n_b, n_b), dtype=a.dtype)
b[not_index.reshape(-1,1), not_index] = a
```
```