2017-02-10 4 views
0

у меня есть проблемы с Numpy ndarray, когда я индексировать несколько измерений одновременно:транспонировать манипуляции с индексацией над несколькими размерами

> a = np.random.random((25,50,30)) 
> b = a[0,:,np.arange(30)] 
> print(b.shape) 

Здесь я ожидал, что результат будет (50,30), но на самом деле реальный результат есть (30,50)!

Может кто-нибудь объяснить это мне, пожалуйста, я не понимаю, и эта функция вводит множество ошибок в моем коде. Спасибо :)


Дополнительная информация:

индексирование в одном измерении работает отлично:

> b = a[0,:,:] 
> print(b.shape) 
(50,30) 

И когда у меня есть транспонирование:

> a[0,:,0] == b[0,:] 
True 

ответ

1

От Numpy docs

Самый простой способ понять ситуацию - подумать в терминах формы результата. Для операции индексирования есть две части: подпространство, определяемое базовым индексированием (исключая целые числа) и подпространство из расширенной части индексации. Необходимо отметить два случая индекса :

Перечисленные индексы разделены срезом, эллипсисом или новым тактом. Например x [arr1,:, arr2].

Перечисленные индексы находятся рядом друг с другом. Например, x [..., arr1, arr2,:] , но не x [arr1,:, 1], поскольку 1 - это продвинутый индекс в в этом отношении.

В первом случае размеры, вытекающие из передовой операции индексации прийти первым в массиве результатов, а размеры подпространства после этого. Во втором случае размеры из расширенных операций индексирования вставляются в массив результатов на том же месте, что и в исходном массиве (последняя логика заключается в том, что простая передовая индексация ведет себя так же, как нарезка).

(курсив мой) выделенный бит относится к вашему

b = a[0,:,np.arange(30)] 
+0

Спасибо, Пол! Знаете ли вы, есть ли какая-либо логика этого поведения? –

+0

Или это просто трюк, чтобы быть уверенным, что пользователь является суперфокусом при манипуляциях с ndarray: p –

+1

В некотором смысле да, это одно из немногих правил, достаточно общих.Например, предположим, что у нас есть 'a2' 2d и' a3' 3D-массивы и некоторый линейный индексный массив 'i = 0,1,2, ...'. Тогда a2 [i, i] выбирает диагональ a 1d-массив, наблюдайте, что размеры выходного файла соответствуют размеру массива индекса, а не индексированному. Это может быть еще яснее, когда мы используем 3D-массив, подобный «a3 [i,:, i]», это должно выбрать ось y и диагональ плоскости x, z. Но в новом массиве, на какой оси должна идти первая? Существует нет «естественного» способа выбора между (diag, y) и (y, diag), поэтому с помощью _convention_ diag идет первым. –

1

При использовании списка или массива целых чисел индексировать NumPy массив, вы используете что-то, что известно как Fancy Indexing. Правила для Fancy Indexing не так просты, как можно было бы подумать. Именно по этой причине у вас массив неправильного измерения. Чтобы избежать сюрпризов, я бы рекомендовал вам придерживаться нарезки. Таким образом, вы должны изменить свой код на:

a = np.random.random((25,50,30)) 
b = a[0,:,:] 
print(b.shape)