#input
M, N, x = 100,9,3
mat = np.full((M, N), fill_value=False)
#solution
mat[np.repeat(np.arange(M), x), np.ravel([np.random.permutation(N)[:x] for i in range(M)])]=True
Output:
array([[False, True, True, False, False, False, False, False, True],
[ True, True, False, True, False, False, False, False, False],
[False, True, False, False, False, False, True, False, True],
[ True, True, False, True, False, False, False, False, False],
[False, False, False, True, False, False, True, False, True],
[False, True, False, True, False, True, False, False, False],
[False, False, False, True, False, True, True, False, False],
[ True, False, False, False, False, True, True, False, False],
[ True, False, False, True, True, False, False, False, False],
[ True, False, False, False, False, False, True, True, False],
[ True, True, False, False, False, True, False, False, False],
[ True, True, False, False, False, False, True, False, False],
[ True, False, True, False, False, False, False, True, False],
[False, False, False, False, False, True, True, True, False],
[False, False, True, True, False, True, False, False, False],
[False, False, False, True, False, True, True, False, False],
[False, True, False, True, False, False, False, False, True],
[False, False, False, False, True, True, False, True, False],
[False, False, False, False, False, True, True, False, True],
[ True, False, True, False, False, False, False, False, True],
[False, True, False, False, False, False, False, True, True],
[ True, False, False, False, False, True, False, True, False],
[False, False, True, False, False, False, False, True, True],
[ True, False, False, False, False, True, True, False, False],
[ True, True, False, False, False, False, False, True, False],
[False, False, False, True, False, False, True, False, True],
[False, False, True, True, False, False, False, True, False],
[False, False, False, False, False, True, False, True, True],
[False, False, False, False, True, True, False, False, True],
[False, False, True, False, False, True, False, True, False],
[False, True, False, False, True, True, False, False, False],
[False, False, True, True, False, False, True, False, False],
[False, False, False, True, False, True, False, True, False],
[ True, False, False, False, False, False, True, True, False],
[False, True, False, False, True, False, False, False, True],
[False, False, False, True, False, False, False, True, True],
[False, False, True, False, True, True, False, False, False],
[False, True, True, False, False, False, False, False, True],
[False, False, True, True, False, False, True, False, False],
[False, False, False, True, False, True, True, False, False],
[False, True, True, False, False, False, False, False, True],
[False, False, True, False, False, True, False, True, False],
[False, True, False, False, True, False, True, False, False],
[False, True, False, False, False, False, False, True, True],
[False, False, False, True, False, False, False, True, True],
[ True, False, False, True, True, False, False, False, False],
[False, False, False, True, False, True, False, False, True],
[False, False, True, False, True, False, True, False, False],
[ True, False, False, False, False, False, True, False, True],
[ True, True, False, False, False, True, False, False, False],
[False, False, True, True, False, False, True, False, False],
[False, False, True, True, True, False, False, False, False],
[False, False, True, False, True, False, False, False, True],
[False, False, True, False, False, True, True, False, False],
[ True, False, False, True, False, True, False, False, False],
[ True, False, False, False, True, False, False, True, False],
[False, True, True, False, False, False, True, False, False],
[False, False, False, False, False, False, True, True, True],
[ True, False, True, False, False, False, True, False, False],
[False, True, True, False, False, False, False, True, False],
[False, True, False, True, False, False, False, True, False],
[False, True, False, True, True, False, False, False, False],
[ True, False, False, False, False, False, True, True, False],
[ True, False, True, False, False, False, True, False, False],
[False, False, True, False, False, False, True, True, False],
[False, False, False, False, False, True, False, True, True],
[False, False, False, False, False, True, True, True, False],
[False, False, False, False, False, True, True, True, False],
[ True, True, False, False, True, False, False, False, False],
[ True, False, True, False, False, False, True, False, False],
[False, False, False, False, False, False, True, True, True],
[False, True, False, False, True, True, False, False, False],
[False, True, False, True, False, False, False, True, False],
[False, False, False, False, True, True, False, False, True],
[ True, True, False, False, False, False, True, False, False],
[False, True, False, False, True, False, False, True, False],
[False, False, True, True, False, True, False, False, False],
[False, True, False, True, False, True, False, False, False],
[False, False, False, True, False, True, False, False, True],
[ True, False, False, False, False, False, True, False, True],
[False, False, False, True, False, False, True, True, False],
[False, False, False, False, True, True, True, False, False],
[False, False, False, True, False, False, False, True, True],
[False, True, False, False, False, True, True, False, False],
[False, False, False, True, False, True, False, True, False],
[False, True, False, False, True, False, False, True, False],
[False, True, False, False, True, False, False, False, True],
[False, False, False, False, False, True, False, True, True],
[ True, False, False, False, True, False, False, True, False],
[ True, False, True, False, False, True, False, False, False],
[False, False, True, False, False, False, True, False, True],
[False, False, True, True, False, True, False, False, False],
[False, False, False, False, True, True, True, False, False],
[False, False, False, False, True, False, False, True, True],
[False, False, False, False, True, False, True, False, True],
[False, True, True, True, False, False, False, False, False],
[ True, False, False, False, False, True, False, False, True],
[ True, True, False, True, False, False, False, False, False],
[ True, False, False, False, True, False, False, False, True],
[ True, False, False, True, True, False, False, False, False]])
The time required in my machine is 0.002034902572631836
seconds, vs your solution that requires 0.0050237178802490234
#check the results
(mat.sum(1)==3).all() #True
mat.sum(0) #array([34, 30, 33, 46, 23, 35, 36, 31, 32])