For what it's worth, here's how simple it is in NumPy:
>>> a = numpy.arange(36).reshape(6, 6) >>> a array([[ 0, 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16, 17], [18, 19, 20, 21, 22, 23], [24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34, 35]]) >>> block3 = a[3:6, 0:3] >>> block3[:] = numpy.rot90(block3, 1).copy() >>> a array([[ 0, 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16, 17], [20, 26, 32, 21, 22, 23], [26, 25, 31, 27, 28, 29], [20, 26, 20, 33, 34, 35]])