2013-04-19 13 views
20

Quindi negli array numpy c'è la funzione incorporata per ottenere gli indici diagonali, ma non riesco a capire come ottenere la diagonale partendo dall'alto in alto invece che in alto a sinistra .ottenere la diagonale opposta di un array numpy

Questo è il codice normale per ottenere partendo dall'alto a sinistra:

>>> import numpy as np 
>>> array = np.arange(25).reshape(5,5) 
>>> diagonal = np.diag_indices(5) 
>>> array 
array([[ 0, 1, 2, 3, 4], 
    [ 5, 6, 7, 8, 9], 
    [10, 11, 12, 13, 14], 
    [15, 16, 17, 18, 19], 
    [20, 21, 22, 23, 24]]) 
>>> array[diagonal] 
array([ 0, 6, 12, 18, 24]) 

così che cosa devo usare se voglio che ritorni:

array([ 4, 8, 12, 16, 20]) 

risposta

28

C'è

In [47]: np.diag(np.fliplr(array)) 
Out[47]: array([ 4, 8, 12, 16, 20]) 

o

In [48]: np.diag(np.rot90(array)) 
Out[48]: array([ 4, 8, 12, 16, 20]) 

Dei due, np.diag(np.fliplr(array)) è più veloce:

In [50]: %timeit np.diag(np.fliplr(array)) 
100000 loops, best of 3: 4.29 us per loop 

In [51]: %timeit np.diag(np.rot90(array)) 
100000 loops, best of 3: 6.09 us per loop 
+3

Hai iniziato la cosa tempi, ecco il mio miglior colpo a fare in fretta: 'step = len (array) - 1; np.take (array, np.arange (step, array.size, step)) ' – Jaime

+0

@Jaime: È fantastico, molto più veloce della mia soluzione. Forse abbiamo bisogno 'np.arange (step, array.size-1, step)' comunque? Si prega di postarlo come soluzione in modo da poter votare. – unutbu

+1

Ho lo Zen di Python di Tim Peters appeso al muro del mio cubo, appena fuori dal mio monitor. Non posso pubblicare il codice del commento come risposta mentre ** i conteggi di leggibilità ** mi stanno guardando ...: P La tua soluzione con 'fliplr' è probabilmente la migliore: abbastanza veloce e molto, molto più comprensibile quando la rivedi un paio di mesi dopo averlo scritto. – Jaime

3

Ecco due idee:

step = len(array) - 1 

# This will make a copy 
array.flat[step:-step:step] 

# This will make a veiw 
array.ravel()[step:-step:step] 
+0

Il secondo potrebbe fare una copia;) – seberg

Problemi correlati