Это известно как расширенное индексирование . Расширенная индексация позволяет выбирать произвольные элементы во входном массиве на основе N-мерного индекса.
Давайте рассмотрим еще один пример:
a = np.random.randint(1, 5, (5,4,3))
v = np.ones((5, 4), dtype=int)
Скажем в этом случае a
это:
array([[[2, 1, 1],
[3, 4, 4],
[4, 3, 2],
[2, 2, 2]],
[[4, 4, 1],
[3, 3, 4],
[3, 4, 2],
[1, 3, 1]],
[[3, 1, 3],
[4, 3, 1],
[2, 1, 4],
[1, 2, 2]],
...
Индексируя массивом np.ones
:
print(v)
array([[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]])
Вы просто будете индексировать a
с 1
вдоль первой оси столько раз, сколько v
. Говоря по-другому, когда вы делаете:
a[1]
[[4, 4, 1],
[3, 3, 4],
[3, 4, 2],
[1, 3, 1]]
Вы индексируете по первой оси, поскольку индексация по дополнительным осям не указана. Это то же самое, что и a[1, ...]
, то есть полный срез вдоль оставшихся осей. Следовательно, если индексировать их массивом 2D
, у вас будет вышеупомянутый 2D
массив (5, 4)
раз, сложенный вместе, в результате чего образуется массив (5, 4, 4, 3)
. Или, другими словами, a[1]
, формы (4,3)
, сложены 5*4=20
раз.
Следовательно, в этом случае вы получите:
array([[[[4, 4, 1],
[3, 3, 4],
[3, 4, 2],
[1, 3, 1]],
[[4, 4, 1],
[3, 3, 4],
[3, 4, 2],
[1, 3, 1]],
...