Чтобы использовать список или массив в индексировании 2d, вам нужно подумать о том, что 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_
делает это проще:
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]])
илито же самое со списками:
In [268]: mx[[[1],[2]], [2,3]]
Out[268]:
array([[ 7, 8],
[12, 13]])
Индексирует строки 1 и 2, а столбцы 2 и 3 - в декартовом смысле, а не попарно.
In [269]: mx[[1,2], [2,3]] # diagonal of the block
Out[269]: array([ 7, 13])