X[i, :]
дает i-ю строку X
в виде массива формы (X.shape[1],)
X[[i], :]
дает i-ю строку X
как массив формы (1, X.shape[1])
X[[[i]], :]
дает i-ю строку X
как массив формы (1, 1, X.shape[1])
X[[[[i]]], :]
дает i-ую строку X
в виде массива формы (1, 1, 1, X.shape[1])
...
Как видите, таким образом вы просто вводите дополнительные измерения, а форма выходного массива - это форма индексного массива + форма строки X
.
Теперь, row[:, np.newaxis]
равен array([[0], [1], [2]])
и имеет форму (3,1)
, а каждый ряд X имеет форму (4,)
. Так X[[[0], [1], [2]], :]
возвращает три строки X, упакованные в массив формы (3,1) + (4,) = (3, 1, 4)
.