Python 以特定方式将两个矩阵串联多次

Python 以特定方式将两个矩阵串联多次,python,numpy,matrix,concatenation,Python,Numpy,Matrix,Concatenation,假设我们有两个尺寸为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],

假设我们有两个尺寸为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]])
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=3
预期输出:

xy=np.array([[1,1,2,2],
            [1,1,2,2],
            [2,2,1,1],
            [2,2,1,1]])
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

一种可能的方法是

给定
x
y
和级联因子
a
,首先创建
a
x
的矩阵
x
,然后获取其所有索引
x\u idx
,即块对角元素的索引。这里,我假设您的
x
不包含零组件

现在,创建一个矩阵
Y
,它只是
Y
块的形状
(a,a)
。最后,让我们将
X_idx
掩码应用于
Y
的对角块,并将
X
Y
相加,以获得所需的
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.非零
调用替换为:

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())