It seems like using np.random.choice is indeed a slow way to get a grid in which 5% of the values are 1. I would recommend using np.random.rand(size) >= mutations:
> python3 -m timeit 'import numpy as np; mutations=0.05; rows=10; columns=10; np.random.choice([0,1], p=[(1-mutations), mutations],size=(rows,columns))'
50000 loops, best of 5: 8.88 usec per loop`
> python3 -m timeit 'import numpy as np; mutations=0.05; rows=10; columns=10; np.random.rand(rows,columns) <= mutations'
200000 loops, best of 5: 1.06 usec per loop