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)
感谢大家提供的答案。
您只需使用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.asmatrix和np.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)