Нарезка многомерных массивов - PullRequest
8 голосов
/ 07 сентября 2011

Предположим, я определил массив NumPy 3x3x3 с

x = numpy.arange(27).reshape((3, 3, 3))

Теперь я могу получить массив, содержащий элемент (0,1) каждого подмассива 3x3 с x[:, 0, 1], который возвращает array([ 1, 10, 19]). Что если у меня есть кортеж (m, n) и я хочу получить элемент (m, n) каждого подмассива (0,1), хранящегося в кортеже?

Например, предположим, что у меня есть t = (0, 1). Я пробовал x[:, t], но у него неправильное поведение - он возвращает строки 0 и 1 каждого подмассива. Самое простое решение, которое я нашел, это

x.transpose()[tuple(reversed(t))].transpose()

но я уверен, что должен быть лучший способ. Конечно, в этом случае я мог бы сделать x[:, t[0], t[1]], но это не может быть обобщено на случай, когда я не знаю, сколько измерений x и t имеют.

Ответы [ 2 ]

9 голосов
/ 07 сентября 2011

Вы можете сначала создать индексный кортеж:

index = (numpy.s_[:],)+t 
x[index]
4 голосов
/ 07 сентября 2011

HYRY решение верное, но я всегда находил индексные трюки numpy r_, c_ и s_ немного странными.Итак, вот эквивалентная вещь, использующая объект slice:

x[(slice(None),) + t]

Этот единственный аргумент для среза является позицией остановки (то есть None означает все так же, как x[:] эквивалентно x[None:None])

...