Каждый []
оценивается интерпретатором Python отдельно, например,
In [117]: a=np.random.rand(3,4,5)
In [118]: a[0]
Out[118]:
array([[0.98688694, 0.77224477, 0.19871568, 0.00552212, 0.81546143],
[0.70685734, 0.72900717, 0.77127035, 0.07404465, 0.35846573],
[0.11586906, 0.86310343, 0.62329813, 0.33089802, 0.06355835],
[0.31098232, 0.32518332, 0.72960618, 0.63755747, 0.88721274]])
In [119]: _[:]
Out[119]:
array([[0.98688694, 0.77224477, 0.19871568, 0.00552212, 0.81546143],
[0.70685734, 0.72900717, 0.77127035, 0.07404465, 0.35846573],
[0.11586906, 0.86310343, 0.62329813, 0.33089802, 0.06355835],
[0.31098232, 0.32518332, 0.72960618, 0.63755747, 0.88721274]])
In [120]: _[3]
Out[120]: array([0.31098232, 0.32518332, 0.72960618, 0.63755747, 0.88721274])
Делая конечные фрагменты явными (для ясности нам, людям):
In [121]: a[0,:,:][:,:][3,:]
Out[121]: array([0.31098232, 0.32518332, 0.72960618, 0.63755747, 0.88721274])
Середина [:]
не выбирает размер из оригинала a
.Он работает с результатом a[0,:,:]
и ничего не делает (кроме создания нового массива с той же формой и данными).Последний [3]
не выбирает из третьего измерения a
- он выбирает из первого измерения массива, полученного на шаге [:]
.Обратите внимание, что он возвращает массив shape (5,), размер последнего измерения a
.a[0,3,:]
производит то же самое.
Это, с другой стороны, полностью обрабатывается с помощью индексирования numpy и обрабатывает сразу все 3 измерения:
In [122]: a[0,:,3]
Out[122]: array([0.00552212, 0.07404465, 0.33089802, 0.63755747])
Возвращает форму (4,), средний размер a
.a[0,:,:][:,3]
производит то же самое.
Ключевым моментом является то, что numpy
работает в интерпретаторе Python;это не меняет синтаксис Python.