2017-02-10 26 views

回答

7

方法1:一個簡單的方法是用np.bmat -

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

採樣運行 -

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

方法2:對於數組的通用號碼,我們可以使用masking -

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 

方法3:對於一般數量的陣列,以multi-dimensional slicing另一種方式 -

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) 

樣品試驗 -

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這樣的10個數組嗎? – MYGz

+0

@Divakar,是否可以轉換回'np.array'?現在看起來它是'np.matrix'。 – ollydbg23

+0

@ ollydbg23爲此編輯。 – Divakar