To use a list or array in indexing 2d, you need to think in terms of broadcasting:
In [263]: mx = np.arange(25).reshape(5,5)
In [264]: mx[1:3, 2:4]
Out[264]:
array([[ 7, 8],
[12, 13]])
In [265]: mx[np.arange(1,3)[:,None], np.arange(2,4)]
Out[265]:
array([[ 7, 8],
[12, 13]])
np.ix_ makes that easier:
In [266]: np.ix_(np.arange(1,3), np.arange(2,4))
Out[266]:
(array([[1],
[2]]), array([[2, 3]]))
In [267]: mx[np.ix_(np.arange(1,3), np.arange(2,4))]
Out[267]:
array([[ 7, 8],
[12, 13]])
or the same thing with lists:
In [268]: mx[[[1],[2]], [2,3]]
Out[268]:
array([[ 7, 8],
[12, 13]])
This is indexing rows 1 and 2, and columns 2 and 3 - in a cartesian sense, not pairwise.
In [269]: mx[[1,2], [2,3]] # diagonal of the block
Out[269]: array([ 7, 13])