如何用python将矩阵打包到单元格中然后形成对角矩阵

LEO*_*HDZ 1 python arrays matrix blockdiag

我需要在 python 中从重复 3 次的 X 矩阵创建一个对角矩阵。在matlab中我按以下方式进行:

  X=[1 2 3;
     4 5 6;
     7 8 9]

for i=1:1:3
  Brep{i}=X;      
end    
Mdiag=blkdiag(Brep{:})

Mdiag =

 1     2     3     0     0     0     0     0     0
 4     5     6     0     0     0     0     0     0
 7     8     9     0     0     0     0     0     0
 0     0     0     1     2     3     0     0     0
 0     0     0     4     5     6     0     0     0
 0     0     0     7     8     9     0     0     0
 0     0     0     0     0     0     1     2     3
 0     0     0     0     0     0     4     5     6
 0     0     0     0     0     0     7     8     9
Run Code Online (Sandbox Code Playgroud)

但我不知道如何在 Pyhton 中做到这一点。

我将不胜感激任何帮助。

- - - - - - - - - - - - - - - - - 回答: - - - - - - - - -----------------------

考虑到 Fabrizio Bernini 提供的答案,我修改了他的代码以使其更通用。该代码现在可以在对角线上重复矩阵 X(任何维度)n 次。例如:

import numpy as np
Run Code Online (Sandbox Code Playgroud)

n=5

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

Mdiag = np.zeros((n*x.shape[0], n*x.shape[1]))

for i in range(n):

Mdiag[x.shape[0]*i:x.shape[0]*i+x.shape[0],x.shape[1]*i:x.shape[1]*i+x.shape[1]]= x

Mdiag =[1., 2., 3., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [4., 5., 6., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [7., 8., 9., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 1., 2., 3., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 4., 5., 6., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 7., 8., 9., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 1., 2., 3., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 4., 5., 6., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 7., 8., 9., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 2., 3., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 4., 5., 6., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 7., 8., 9., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 2., 3.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 4., 5., 6.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 7., 8., 9.]
Run Code Online (Sandbox Code Playgroud)

感谢大家提供的答案。

MrN*_*y33 5

您只需使用scipy.linalg.block_diag

from scipy.linalg import block_diag
X=[[1, 2, 3],
     [4,5,6],
     [7, 8, 9]]
block_diag(X, X, X)
Run Code Online (Sandbox Code Playgroud)

输出:

array([[1, 2, 3, 0, 0, 0, 0, 0, 0],
       [4, 5, 6, 0, 0, 0, 0, 0, 0],
       [7, 8, 9, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 2, 3, 0, 0, 0],
       [0, 0, 0, 4, 5, 6, 0, 0, 0],
       [0, 0, 0, 7, 8, 9, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 2, 3],
       [0, 0, 0, 0, 0, 0, 4, 5, 6],
       [0, 0, 0, 0, 0, 0, 7, 8, 9]], dtype=int32)
Run Code Online (Sandbox Code Playgroud)

另一种选择,使用np.bmat,np.asmatrixnp.asarray, 可能是这样的:

import numpy as np

X=np.asmatrix([[1, 2, 3],
     [4,5,6],
     [7, 8, 9]])
y = np.asmatrix(np.zeros((3, 3)))

r=np.asarray(np.bmat('X, y, y; y, X, y; y, y, X'))
print(r)
Run Code Online (Sandbox Code Playgroud)