Непоследовательная нарезка многомерного массива в Python - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь выполнить непоследовательное нарезание многомерного массива, как это (pelao-код Matlab)

 A = B(:,:,[1,3],[2,4,6]) %A and B are two 4D matrices

Но когда я пытаюсь написать этот код на Python:

A = B[:,:,np.array([0,2]),np.array([1,3,5])] #A and B are two 4D arrays

выдает ошибку: IndexError: несоответствие формы: индексирование массивов не может быть передано ...

Следует отметить, что нарезка для одного измерения каждый раз работает нормально!

1 Ответ

0 голосов
/ 31 октября 2018

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

B[:, :, [0,2]] [..., [1,3,5]]

, где ... обозначает максимально возможное количество :.

Двойное индексирование таким образом приведет к дополнительному времени перемещения данных. Если вы хотите индексировать только один раз, убедитесь, что они транслируются (т.е. помещают причудливые индексы в другое измерение):

B[:, :, np.array([0,2])[:,None], [1,3,5]]

, что приведет к массиву X by Y by 2 by 3. С другой стороны, вы также можете сделать

B[:, :, [0,2], np.array([1,3,5])[:,None]]

, что приведет к массиву X by Y by 3 by 2. Ось [1,3,5] перемещается перед осью [0,2].

Вам не нужно использовать np.array([0,2]), если вам не нужно делать необычные операции с ним. Просто [0,2] отлично.

np.array([0,2])[:,None] эквивалентно [[0],[2]], где точка [:,None] состоит в том, чтобы создать дополнительное измерение таким образом, чтобы форма стала (2,1). Формы (2,) и (3,) не могут транслироваться, а фигуры (2,1) и (3,) могут стать (2,3).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...