Python 以特定方式将两个矩阵串联多次
假设我们有两个尺寸为nxn的方阵“x”和“y”以及一个数值变量“a”。我想根据参数“a”将这些矩阵串联多次,以获得更大的方阵“xy”。 该新矩阵将仅包含按以下方式排列的前两个矩阵的副本:新矩阵“xy”主对角线上的矩阵“x”,以及矩阵“xy”所有其他条目中的矩阵“y” 以下是一些澄清问题的示例: 输入:两个2x2矩阵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],
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())