我有 K 个(此处 K 为 7)维度(50,50)
的不同矩阵。
我想通过用 K 矩阵填充对角线来创建一个新的矩阵 L。因此 L 的尺寸为 (50*K,50*K)。
我尝试过什么?
K1=np.random.random((50,50))
N,N=K1.shape
K=7
out=np.zeros((K,N,K,N),K1.dtype)
np.einsum('ijik->ijk', out)[...] = K1
L=out.reshape(K*N, K*N) # L is of dimension (50*7,50*7)=(350,350)
它确实通过在对角线内堆叠 K1 七次来创建一个新的矩阵 L。然而,我想分别堆叠 K1,K2,K3,K5,K6,K7 而不是 K1 七次。
输入:
K1=np.random.random((50,50))
K2=np.random.random((50,50))
K3=np.random.random((50,50))
K4=np.random.random((50,50))
K5=np.random.random((50,50))
K6=np.random.random((50,50))
K7=np.random.random((50,50))
L=np.zeros((50*7,50*7))#
预期输出:
L[:50,:50]=K1
L[50:100,50:100]=K2
L[100:150,100:50]=K3
L[150:200,150:200]=K4
L[200:250,200:250]=K5
L[250:300,250:300]=K6
L[300:350,300:350]=K7
最佳答案
你可以尝试scipy.linalg.block_diag
。如果您查看源代码,该函数基本上只是按照您编写为输出的方式循环遍历给定的 block 。它可以像这样使用:
K1=np.random.random((50,50))
K2=np.random.random((50,50))
K3=np.random.random((50,50))
K4=np.random.random((50,50))
K5=np.random.random((50,50))
K6=np.random.random((50,50))
K7=np.random.random((50,50))
L=sp.linalg.block_diag(K1,K2,K3,K4,K5,K6,K7)
如果您的 K
是形状 (7,50,50)
的 ndarray,您可以直接解压它,如下所示:
K=np.random.random((7,50,50))
L=sp.linalg.block_diag(*K)
如果您不想导入 scipy,您始终可以编写一个简单的循环来执行您为预期输出编写的操作。
关于python-3.x - 通过堆叠对角 K 矩阵来创建一个新的大矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54576131/