Numpy Расширенная индексация n-мерного массива с помощью n-мерного массива

#python #arrays #numpy #indexing

Вопрос:

Мне трудно понять, как работает индексирование n-мерного массива с помощью n-мерного массива.

 import numpy as np
a = np.random.rand(25).reshape(5, 5)
index = np.array([[0, 1, 2, 3, 4], [0, 1, 2, 3, 4]])
a[index] = 1.0
# a is now full of 1.0
 

Я бы ожидал получить то же самое, что

 import numpy as np
a = np.random.rand(25).reshape(5, 5)
index = np.array([0, 1, 2, 3, 4])
a[index, index] = 1.0
# only diagonal of a is now 1.0
 

Почему я получаю в первом примере массив всех 1.0 s?
В руководстве numpy не упоминается случай индексирования и n-мерного массива с n-мерным массивом (за исключением n=1).
https://numpy.org/doc/stable/reference/arrays.indexing.html

Ваше здоровье!

Комментарии:

1. Посмотрите a[index] и на его форму. Вы применяетесь index к первому измерению a , эффективно a[index,:]

2. в первом блоке кода вы должны взглянуть на возвращаемое значение a[index] (без присвоения). попробуйте index = np.array([[1,2],[4,3]]) еще раз и посмотрите на результат, тогда вы поймете, что на самом деле произошло.

3. Где в документах вы получаете представление о том, что массивы индексирования ограничены 1d? Первый абзац advanced раздела гласит: «Индексирование целых массивов позволяет выбирать произвольные элементы в массиве на основе их N-мерного индекса. Каждый целочисленный массив представляет собой ряд индексов в этом измерении.»

4. Ключевым моментом при использовании нескольких индексирующих массивов является то, что они транслируются друг против друга. Это происходит в вашем втором [index,index] случае. Но в первом [index,:] случае у вас есть только один массив. Она может быть многомерной. Использование массива (2,5) для индексирования первого измерения (5,5) дает результат (2,5,5).

5. Хорошо, это все объясняет для меня. Это транслируется с [index, :]. Все еще кажется странным, что numpy позволяет это. Потому что индекс в первом случае представляет собой 2-мерный массив, и он неявно преобразуется в 1-мерный массив.