2015-11-03 18 views
7

Ho un array numpy bidimensionale con un numero uguale di colonne e righe. Mi piacerebbe sistemarli in un array più grande avendo i più piccoli sulla diagonale. Dovrebbe essere possibile specificare la frequenza con cui la matrice di partenza dovrebbe essere sulla diagonale. Per esempio:Creare un array numpy diagonale a blocchi da un determinato array numpy

a = numpy.array([[5, 7], 
       [6, 3]]) 

Quindi, se ho voluto questo array 2 volte sulla diagonale l'output desiderato sarebbero:

array([[5, 7, 0, 0], 
     [6, 3, 0, 0], 
     [0, 0, 5, 7], 
     [0, 0, 6, 3]]) 

Per 3 volte:

array([[5, 7, 0, 0, 0, 0], 
     [6, 3, 0, 0, 0, 0], 
     [0, 0, 5, 7, 0, 0], 
     [0, 0, 6, 3, 0, 0], 
     [0, 0, 0, 0, 5, 7], 
     [0, 0, 0, 0, 6, 3]]) 

C'è un modo veloce implementare questo con metodi numpy e per dimensioni arbitrarie dell'array di partenza (considerando ancora l'array di partenza per avere lo stesso numero di righe e colonne)?

risposta

11

classico caso di numpy.kron -

np.kron(np.eye(n), a) 

Campione run -

In [57]: n = 2 

In [58]: np.kron(np.eye(n), a) 
Out[58]: 
array([[ 5., 7., 0., 0.], 
     [ 6., 3., 0., 0.], 
     [ 0., 0., 5., 7.], 
     [ 0., 0., 6., 3.]]) 

In [59]: n = 3 

In [60]: np.kron(np.eye(n), a) 
Out[60]: 
array([[ 5., 7., 0., 0., 0., 0.], 
     [ 6., 3., 0., 0., 0., 0.], 
     [ 0., 0., 5., 7., 0., 0.], 
     [ 0., 0., 6., 3., 0., 0.], 
     [ 0., 0., 0., 0., 5., 7.], 
     [ 0., 0., 0., 0., 6., 3.]]) 
+0

come faresti questo se è necessario inserire x diverse matrici nel diagonale? Ho 80 diverse matrici, che devono essere trasformate in una matrice a blocchi diagonali. –

+0

@ Will.Evo Tutte le 80 delle stesse forme? – Divakar

+0

Sì sempre la stessa forma –