2010-12-14 18 views
9

Questo sembra semplice (ed è banale scrivere un ciclo a tre linee per), ma come posso usare numpy slicing creare un elenco delle posizioni dell'indice della diagonale superiore di un array numpy? CioèDiagonale superiore di un array numpy 2D

Data una matrice 4x4, vorrei le posizioni di indice a le X:

[ X X X X ] 
[ 0 X X X ] 
[ 0 0 X X ] 
[ 0 0 0 X ] 

Dare:

[ (0,0), (0,1), (0,2), (0,3), (1,1), (1,2), (1,3), (2,2), (2,3), (3,3) ] 

risposta

8

carnieri mi ha battuto alla risposta numpy.triu_indices, ma c'è anche numpy.triu_indices_from che accetta un array come input piuttosto che le dimensioni.

+0

Grazie per la risposta (Justin e Carnieri). Due cose da notare, questo richiede Numpy 1.4 che attualmente non è lo standard su Ubuntu. Inoltre si possono ottenere gli indici richiesti semplicemente scompattando la risposta, cioè. 'Zip (* numpy.triu_indices (X))'. – Hooked

2

se si sta eseguendo Ubuntu e non vogliono aggiornare Numpy proprio per questo, è possibile utilizzare la seguente funzione:

from itertools import chain 
triu_indices = lambda x, y=0: zip(*list(chain(*[[(i, j) for j in range(i + y, x)] for i in range(x - y)]))) 

Esempio:

In [26]: triu_indices = lambda x, y=0: zip(*list(chain(*[[(i, j) for j in range(i + y, x)] for i in range(x - y)]))) 

In [27]: triu_indices(4) 
Out[27]: [(0, 0, 0, 0, 1, 1, 1, 2, 2, 3), (0, 1, 2, 3, 1, 2, 3, 2, 3, 3)] 

In [28]: zip(*triu_indices(4)) 
Out[28]: 
[(0, 0), 
(0, 1), 
(0, 2), 
(0, 3), 
(1, 1), 
(1, 2), 
(1, 3), 
(2, 2), 
(2, 3), 
(3, 3)]