2016-01-05 20 views
5

Mam tablicę 5D "a", o rozmiarze (3,2,2,2,2).Obracanie tablicy 5D w dwóch ostatnich wymiarach

import numpy as np 
a = np.arange(48).reshape(3,2,2,2,2) 
a[0,0,0]: 
array([[0, 1], 
     [2, 3]]) 

Co chcę zrobić, to obracać ten 5D tablicę o 180 stopni, ale tylko w ciągu ostatnich dwóch wymiarach, bez ich stanowisk zmieniło. Więc wyjście [0,0,0] powinna wyglądać następująco:

out[0,0,0]: 
array([[3, 2], 
     [1, 0]]) 

Co próbowałem:

out = np.rot90(a, 2) 
out[0,0,0]: 
array([[40, 41], 
     [42, 43]]) 

Funkcja rot90 najwyraźniej obraca całą tablicę.

Uwaga: Chcę uniknąć stosując na pętli, jeśli to możliwe

Odpowiedz

2

Aby obrócić ciągu ostatnich dwóch osi o 180 stopni, przechodzą axes=(-2, -1) do np.rot90:

>>> a180 = np.rot90(a, 2, axes=(-2, -1)) 
>>> a180[0, 0, 0] 
array([[3, 2], 
     [1, 0]]) 

Jeśli wersja NumPy nie posiada parametr axes z np.rot90 istnieje są alternatywne.

Jednym ze sposobów jest z indeksowaniem:

a180 = a[..., ::-1, ::-1] 

rot90 odwraca pierwsze dwie osie tablicy, więc go używać trzeba by transpozycji (do odwrócenia osi), obracanie i transponowania z powrotem. Na przykład:

np.rot90(a.T, 2).T 
+0

Dziękuję. Ale nie tego. – Babak

1

Gdybym zrozumiał pytanie poprawnie, można odwrócić rozmieszczenie elementów wzdłuż ciągu ostatnich dwóch osiach, tak jak -

a[:,:,::-1,::-1] 

można również przekształcić w 2D tablicy łączących ostatnie dwie osie jako ostatniej osi, a następnie odwrócić elementów wzdłuż niego i przekształcić z powrotem, tak jak -

a.reshape(-1,np.prod(a.shape[-2:]))[:,::-1].reshape(a.shape) 

run Sample -

In [141]: a[0][0] 
Out[141]: 
array([[57, 64, 69], 
     [41, 28, 89]]) 

In [142]: out1 = a[:,:,::-1,::-1] 

In [143]: out2 = a.reshape(-1,np.prod(a.shape[-2:]))[:,::-1].reshape(a.shape) 

In [144]: out1[0][0] 
Out[144]: 
array([[89, 28, 41], 
     [69, 64, 57]]) 

In [145]: out2[0][0] 
Out[145]: 
array([[89, 28, 41], 
     [69, 64, 57]]) 
Powiązane problemy