2017-02-10 8 views
8
import numpy as np 

A = np.array([[1, 2], 
       [3, 4]])  
B = np.array([[5, 6], 
       [7, 8]]) 

C = np.array([[1, 2, 0, 0], 
       [3, 4, 0, 0], 
       [0, 0, 5, 6], 
       [0, 0, 7, 8]]) 

Ben A ve B doğrudan C yapmak istiyorum , bir köşegen dizi C inşa etmek herhangi basitçe yolu vardır? Teşekkürler.piton numpy: iki küçük diziden büyük bir diyagonal dizisi (matriks) nasıl oluşturulacağı

+0

olan 'İstenen çıktıyı ya da ne C'? – marmeladze

+0

Evet, C istenen çıktı. – ollydbg23

cevap

7

Yaklaşım # 1: kolay yollarından biri olacağını np.bmat ile -

Z = np.zeros((2,2),dtype=int) # Create off-diagonal zeros array 
out = np.asarray(np.bmat([[A, Z], [Z, B]])) 

Numune koşmak

-

In [24]: Z = np.zeros((2,2),dtype=int) 

In [25]: np.asarray(np.bmat([[A, Z], [Z, B]])) 
Out[25]: 
array([[1, 2, 0, 0], 
     [3, 4, 0, 0], 
     [0, 0, 5, 6], 
     [0, 0, 7, 8]]) 

Yaklaşım # 2: diziler jenerik numarası için, masking -

'i kullanabiliriz
def diag_block_mat_boolindex(L): 
    shp = L[0].shape 
    mask = np.kron(np.eye(len(L)), np.ones(shp))==1 
    out = np.zeros(np.asarray(shp)*len(L),dtype=int) 
    out[mask] = np.concatenate(L).ravel() 
    return out 

Yaklaşım # 3: Dizilerin jenerik sayıda multi-dimensional slicing başka yolu için -

def diag_block_mat_slicing(L): 
    shp = L[0].shape 
    N = len(L) 
    r = range(N) 
    out = np.zeros((N,shp[0],N,shp[1]),dtype=int) 
    out[r,:,r,:] = L 
    return out.reshape(np.asarray(shp)*N) 

Numune seferleri -

In [137]: A = np.array([[1, 2], 
    ...:    [3, 4]])  
    ...: B = np.array([[5, 6], 
    ...:    [7, 8]]) 
    ...: C = np.array([[11, 12], 
    ...:    [13, 14]]) 
    ...: D = np.array([[15, 16], 
    ...:    [17, 18]]) 
    ...: 

In [138]: diag_block_mat_boolindex((A,B,C,D)) 
Out[138]: 
array([[ 1, 2, 0, 0, 0, 0, 0, 0], 
     [ 3, 4, 0, 0, 0, 0, 0, 0], 
     [ 0, 0, 5, 6, 0, 0, 0, 0], 
     [ 0, 0, 7, 8, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 11, 12, 0, 0], 
     [ 0, 0, 0, 0, 13, 14, 0, 0], 
     [ 0, 0, 0, 0, 0, 0, 15, 16], 
     [ 0, 0, 0, 0, 0, 0, 17, 18]]) 

In [139]: diag_block_mat_slicing((A,B,C,D)) 
Out[139]: 
array([[ 1, 2, 0, 0, 0, 0, 0, 0], 
     [ 3, 4, 0, 0, 0, 0, 0, 0], 
     [ 0, 0, 5, 6, 0, 0, 0, 0], 
     [ 0, 0, 7, 8, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 11, 12, 0, 0], 
     [ 0, 0, 0, 0, 13, 14, 0, 0], 
     [ 0, 0, 0, 0, 0, 0, 15, 16], 
     [ 0, 0, 0, 0, 0, 0, 17, 18]]) 
+0

A-J gibi 10 dizi için daha programatik hale getirebilir misiniz? – MYGz

+0

@Divakar, 'np.array' öğesine dönüşmek mümkün mü? Şimdi 'np.matrix' gibi görünüyor. – ollydbg23

+0

@ ollydbg23 Bunun için düzenlenmiştir. – Divakar

İlgili konular