Your test is incorrect: for i, j = 0,0, your M2 [] = assignments just overwrite the same matrix block.
The reason you get the symmetric matrix when using M1 is because you assign the values โโof M1 in one cycle.
if you divide the loop into two:
for x in range(n): M1[i:i+n,j+x] = m[x] for x in range(n): M1[j+x,i:i+n] = m[x]
M1 will obviously be the same as M2.
So, to summarize, the following code works (equivalent to your calculation of M2), but! it will only work if there is no overlap between the blocks above and below the diagonal. if you need to decide what to do there
xs=np.arange(4).reshape(2,2) ys=np.zeros((7,7)) ys[i:i+n,j:j+n]=xs ys[j:j+n,i:i+n]=xs.T print ys >> array([[ 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 1., 0., 0.], [ 0., 0., 0., 2., 3., 0., 0.], [ 0., 0., 2., 0., 0., 0., 0.], [ 0., 1., 3., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0.]])