python-3.x - 通过堆叠对角 K 矩阵来创建一个新的大矩阵

标签 python-3.x numpy matrix diagonal numpy-einsum

我有 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/

相关文章:

python - 使用两个不同的间距值在 Python 中创建数组

用于列表的 python numpy.where 函数

python - 在 python 中向量化 6 for 循环累积和

python - 高效的二维数组处理

python-3.x - 带有代理 : How to improve number of frames per second 的 PUB-SUB 网络

python - 类装饰器上的 Mypy 注释

python - numpy/python 中的矢量替换

python - 连接两列并获得新列

python - Python 中二维矩阵的单元分配,没有 numpy

python - Theano 矩阵乘法