Basi c Индексирование срезами является самым простым способом:
In [382]: arr = np.arange(1,13).reshape(3,4)
In [383]: arr[1:, 1:]
Out[383]:
array([[ 6, 7, 8],
[10, 11, 12]])
Со списками или массивами они должны broadcast
друг против друга:
In [385]: arr[[[1],[2]], [1,2,3] ]
Out[385]:
array([[ 6, 7, 8],
[10, 11, 12]])
Или эквивалентно с массивами:
In [386]: np.ix_([1,2],[1,2,3])
Out[386]:
(array([[1],
[2]]), array([[1, 2, 3]]))
In [387]: arr[_]
Out[387]:
array([[ 6, 7, 8],
[10, 11, 12]])
То есть массив (2,1) объединяется с (3,) (или (1,3)) для выбора (2,3) блока.
Если два массива / списка не совпадают по длине, вы получите ошибку:
In [388]: arr[[1,2], [1,2,3] ]
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-388-f14b94e53ccb> in <module>
----> 1 arr[[1,2], [1,2,3] ]
IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (2,) (3,)
Если они совпадают по длине, вы получите «диагональ», а не блок:
In [389]: arr[[1,2], [1,2] ]
Out[389]: array([ 6, 11])
Чем больше вы понимаете broadcasting
, тем яснее становится. Здесь применяются те же правила добавления массивов.