Кортеж как индекс многомерного массива

Я нашел очень похожий на мой вопрос, но не совсем такой же. Вот это: здесь Однако в случае ntimes размер массива соответствует количеству измерений, на которые указывает кортеж. В моем случае у меня есть 4-мерный массив и 2-мерный кортеж, вот так:

from numpy.random import rand
big_array=rand(3,3,4,5)
tup=(2,2)

Я хочу использовать кортеж в качестве индекса первых двух измерений и вручную индексировать последние два. Что-то вроде:

big_array[tup,3,2]

Тем не менее, я получаю повторение первого измерения с индексом =2 вдоль четвертого измерения (поскольку оно технически не было проиндексировано). Это потому, что это индексирование интерпретирует двойное индексирование к первому измерению вместо одного значения для каждого измерения,

eg. 
| dim 0:(index 2 AND index 2) , dim 1:(index 3), dim 2:(index 2), dim 3:(no index)|
instead of 
|dim 0(index 2), dim 1(index 2), dim 2:(index 3), dim 3:(index 2)|.

Как я могу "распаковать" этот кортеж тогда? Есть идеи? Спасибо!

2 ответа

Решение

Вы также можете передать свой первый кортеж в одиночку, чтобы получить интересующий фрагмент, а затем проиндексировать его по отдельности:

from numpy.random import rand
big_array=rand(3,3,4,5)
chosen_slice = (2,2)

>>> big_array[ chosen_slice ]
array([[ 0.96281602,  0.38296561,  0.59362615,  0.74032818,  0.88169483],
       [ 0.54893771,  0.33640089,  0.53352849,  0.75534718,  0.38815883],
       [ 0.85247424,  0.9441886 ,  0.74682007,  0.87371017,  0.68644639],
       [ 0.52858188,  0.74717948,  0.76120181,  0.08314177,  0.99557654]])

>>> chosen_part = (1,1)

>>> big_array[ chosen_slice ][ chosen_part ]
0.33640088565877657

Это может быть немного более читабельным для некоторых пользователей, но в противном случае я бы склонялся к решению mgilson.

Так как вы используете numpy:

big_array[tup+(3,2)]

должно сработать. Когда вы звоните __getitem__ (через квадратные скобки) материал передается __getitem__ как кортеж Вам просто нужно построить tuple явно (добавление кортежей вместе, объединяет в новый кортеж) и numpy будет делать то, что вы хотите.

Другие вопросы по тегам