【问题标题】:Concatenate two matrices multiple times in a specific way以特定方式多次连接两个矩阵
【发布时间】:2020-07-27 06:15:02
【问题描述】:

假设我们有两个维度为 nxn 的方阵“x”和“y”以及一个数值变量“a”。我想根据参数“a”多次连接这些矩阵,以获得更大的方阵“xy”。 这个新矩阵将仅包含按以下方式排列的前两个矩阵的副本:新矩阵“xy”的主对角线上的矩阵“x”和矩阵“xy”的所有其他条目中的矩阵“y”。

这里有一些例子来澄清这个问题:

输入:两个 2x2 矩阵

x=np.array([[1,1],[1,1]])
y=np.array([[2,2],[2,2]])

a=2 预期输出:

xy=np.array([[1,1,2,2],
            [1,1,2,2],
            [2,2,1,1],
            [2,2,1,1]])

对于a=3预期输出:

xy=np.array([[1,1,2,2,2,2],
            [1,1,2,2,2,2],
            [2,2,1,1,2,2],
            [2,2,1,1,2,2],
            [2,2,2,2,1,1],
            [2,2,2,2,1,1]])`

我正在寻找的是a=n 的通用案例的代码

【问题讨论】:

    标签: python numpy matrix concatenation


    【解决方案1】:

    一种可能的方法可能是。

    给定xy和连接因子a,首先创建aaxblock diagonal矩阵X,然后取出所有non zero索引X_idx , ie 块对角元素的索引。在这里,我假设您的x 不包含零组件。

    现在,创建一个矩阵Y,它只是形状为(a,a)y 块的tile。最后,让我们通过将X_idx 掩码应用于Y 的对角线块并将XY 相加得到所需的XY 矩阵。如下:

    import numpy as np
    from scipy.linalg import block_diag
    
    x = np.array([[1,1],[1,1]])
    y = np.array([[2,2],[2,2]])    
    a = 3
    
    X =  block_diag(*[x]*a)
    X_idx = np.nonzero(X)
    Y = np.tile(y,(a,a))
    Y[X_idx] = 0
    XY = X + Y
    

    输出对应的XY

    >>> array([[1, 1, 2, 2, 2, 2],
               [1, 1, 2, 2, 2, 2],
               [2, 2, 1, 1, 2, 2],
               [2, 2, 1, 1, 2, 2],
               [2, 2, 2, 2, 1, 1],
               [2, 2, 2, 2, 1, 1]])
    

    如果x 的值为零,只需将np.nonzero 调用替换为:

    X_idx = (np.repeat(np.arange(a*x.shape[0]),x.shape[0]),
             np.r_[[np.tile(np.arange(i,i+x.shape[0]),x.shape[0]) for i in range(0,a*x.shape[0],x.shape[0])]].ravel())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      相关资源
      最近更新 更多