【问题标题】:Create a new large matrix by stacking in its diagonal K matrices通过堆叠其对角 K 矩阵来创建一个新的大矩阵
【发布时间】:2019-02-07 14:56:28
【问题描述】:

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

【问题讨论】:

  • 您能展示一个输入及其预期输出的小例子吗?
  • @jdehesa 请看我的更新

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


【解决方案1】:

你可以试试scipy.linalg.block_diag。如果您查看源代码,则此函数基本上只是按照您作为输出编写的方式循环给定的块。它可以像这样使用:

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,您可以随时编写一个简单的循环来执行您为预期输出编写的内容。

【讨论】:

    【解决方案2】:

    这是使用 NumPy 的一种方法:

    import numpy as np
    
    def put_in_diagonals(a):
        n, rows, cols = a.shape
        b = np.zeros((n * rows, n * cols), dtype=a.dtype)
        a2 = a.reshape(-1, cols)
        ii, jj = np.indices(a2.shape)
        jj += (ii // rows) * cols
        b[ii, jj] = a2
        return b
    
    # Test
    a = np.arange(24).reshape(4, 2, 3)
    print(put_in_diagonals(a))
    

    输出:

    [[ 0  1  2  0  0  0  0  0  0  0  0  0]
     [ 3  4  5  0  0  0  0  0  0  0  0  0]
     [ 0  0  0  6  7  8  0  0  0  0  0  0]
     [ 0  0  0  9 10 11  0  0  0  0  0  0]
     [ 0  0  0  0  0  0 12 13 14  0  0  0]
     [ 0  0  0  0  0  0 15 16 17  0  0  0]
     [ 0  0  0  0  0  0  0  0  0 18 19 20]
     [ 0  0  0  0  0  0  0  0  0 21 22 23]]
    

    【讨论】:

      猜你喜欢
      • 2016-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-06
      • 1970-01-01
      相关资源
      最近更新 更多