numpy.argsort sorts a multi-dimensional array along its last axis, unless specified otherwise. Your s.shape is the same as ar.shape, but the fact that you can even use ar[s] without getting IndexErrors is just because you chose a nice shape to begin with.
You first have to think about what you really want to sort. Say you have:
[[8, 7],
[6, 5],
[4, 3]]
What do you want to get? Left to right:
[[7, 8],
[5, 6],
[3, 4]]
or top to bottom:
[[4, 3],
[6, 5],
[8, 7]]
or completely:
[[3, 4],
[5, 6],
[7, 8]]
The last one is probably easiest to flatten and then reshape.
arf = ar.flatten()
s = numpy.argsort(arf)
arf[s].reshape(ar.shape)
The first one is a bit harder:
s = numpy.argsort(ar)
numpy.array([[ar2[s2] for ar2, s2 in zip(ar1, s1)] for ar1, s1 in zip(ar, s)])
The last one is homework.