В последнем случае два отдельных списка обрабатываются как отдельные операции индексации (это очень неудобная формулировка, поэтому, пожалуйста, потерпите меня).
Numpy видит два списка из двух целых чисел и решает, что вы поэтому просят два значения. Индекс строки каждого значения происходит из первого списка, а индекс столбца каждого значения - из второго списка. Следовательно, вы получаете a[1,1]
и a[2,2]
. Обозначение :
не только расширяет список, который вы точно вывели, но также сообщает numpy, что вы хотите все строки / столбцы в этом диапазоне.
Если вы указываете вручную индексы списка, они должны быть одинакового размера, потому что размер каждого / любого списка - это количество элементов, которые вы получите. Например, если вы хотели, чтобы элементы в столбцах 1 и 2 строк 1,2,3:
>>> a[1:4,[1,2]]
array([[ 6, 7],
[11, 12],
[16, 17]])
Но
>>> a[[1,2,3],[1,2]]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (3,) (2,)
Первый говорит numpy, что вы хотите диапазон строк и спецификаций c столбцов, в то время как последний говорит: «доставь мне элементы в (1,1)
, (2,2)
и (3, hey! what the?! where's the other index?)
»