2016-01-05 27 views
5

Ho un array 5D 'a', di dimensione (3,2,2,2,2).Rotazione di una matrice 5D nelle ultime 2 dimensioni

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

Quello che voglio fare è ruotare la matrice 5D di 180 gradi, ma solo negli ultimi due dimensioni, senza le loro posizioni cambiato. Così uscita [0,0,0] dovrebbe essere simile a questo:

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

Quello che ho cercato:

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

La funzione rot90 ruota a quanto pare l'intero array.

Nota: Voglio evitare di usare i cicli for, se possibile,

risposta

2

Per ruotare gli ultimi due assi 180 gradi, passare axes=(-2, -1)-np.rot90:

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

Se la versione di NumPy non hai il parametro axes con np.rot90, ci sono alternative.

Un modo è con indicizzazione:

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

rot90 ribalta i primi due assi della matrice, quindi usarlo avresti bisogno di trasporre (per invertire gli assi), ruotare, e trasporre di nuovo indietro. Ad esempio:

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

Grazie. Non pensavo a questo. – Babak

1

Se ho capito bene la domanda, si potrebbe invertire la disposizione degli elementi lungo gli ultimi due assi, in questo modo -

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

è anche possibile rimodellare ad una matrice 2D fusione delle ultime due assi come ultimo asse, quindi invertire elementi lungo e rimodellare indietro, in questo modo -

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

corsa del campione -

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]])