2010-11-11 9 views
12

Mam trzy kwadratowe macierze tego samego rozmiaru w NumPy. Chciałbym połączyć je z macierzą blokowo-ukośną.Jak mogę przekształcić bloki w macierz blokowo-ukośną (NumPy)

Przykład:

a1 = np.array([[1,1,1],[1,1,1],[1,1,1]]) 
a2 = np.array([[2,2,2],[2,2,2],[2,2,2]]) 
a3 = np.array([[3,3,3],[3,3,3],[3,3,3]]) 

r = np.array([[1,1,1,0,0,0,0,0,0],[1,1,1,0,0,0,0,0,0],[1,1,1,0,0,0,0,0,0],[0,0,0,2,2,2,0,0,0],[0,0,0,2,2,2,0,0,0],[0,0,0,2,2,2,0,0,0],[0,0,0,0,0,0,3,3,3],[0,0,0,0,0,0,3,3,3],[0,0,0,0,0,0,3,3,3]]) 

Jaki jest najlepszy sposób to zrobić?

Odpowiedz

18

scipy.linalg posiada funkcję block_diag to zrobić automatycznie

>>> a1 = np.array([[1,1,1],[1,1,1],[1,1,1]]) 
>>> a2 = np.array([[2,2,2],[2,2,2],[2,2,2]]) 
>>> a3 = np.array([[3,3,3],[3,3,3],[3,3,3]]) 
>>> import scipy.linalg 
>>> scipy.linalg.block_diag(a1, a2, a3) 
array([[1, 1, 1, 0, 0, 0, 0, 0, 0], 
     [1, 1, 1, 0, 0, 0, 0, 0, 0], 
     [1, 1, 1, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 2, 2, 2, 0, 0, 0], 
     [0, 0, 0, 2, 2, 2, 0, 0, 0], 
     [0, 0, 0, 2, 2, 2, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 3, 3, 3], 
     [0, 0, 0, 0, 0, 0, 3, 3, 3], 
     [0, 0, 0, 0, 0, 0, 3, 3, 3]]) 
>>> r = np.array([[1,1,1,0,0,0,0,0,0],[1,1,1,0,0,0,0,0,0],[1,1,1,0,0,0,0,0,0], [0,0,0,2,2,2,0,0,0],[0,0,0,2,2,2,0,0,0],[0,0,0,2,2,2,0,0,0],[0,0,0,0,0,0,3,3,3],[0,0,0,0,0,0,3,3,3],[0,0,0,0,0,0,3,3,3]]) 
>>> (scipy.linalg.block_diag(a1, a2, a3) == r).all() 
True 
+0

Byłoby miło, gdyby to było dostępne w numpy (bez konieczności innego uzależnienia). – amcnabb

+0

scipy jest zbudowany na numpy. Myślę, że 'scipy.array' powinien działać w zasadniczo taki sam sposób jak' numpy.array'. – hBy2Py

2

Jeśli chcesz tego konkretnego tablicę r, najłatwiejszym sposobem byłoby:

r=np.kron(np.diag([1,2,3]),np.ones((3,3),dtype='int')) 

Jeśli a1, a2, a3 mogą być dowolne macierze 2-wymiarowe, to najłatwiejszym sposobem jest:

a1=np.asmatrix(a1) 
a2=np.asmatrix(a2) 
a3=np.asmatrix(a3) 
z=np.asmatrix(np.zeros((3,3))) 
r=np.asarray(np.bmat('a1, z, z; z, a2, z; z, z, a3')) 

Alternatywną metodą jest wolniejsze:

r=(np.kron([[1,0,0],[0,0,0],[0,0,0]],a1) 
    +np.kron([[0,0,0],[0,1,0],[0,0,0]],a2) 
    +np.kron([[0,0,0],[0,0,0],[0,0,1]],a3)) 
Powiązane problemy