#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-мерный массив.