Python 以特定的方式合并单位矩阵
我有两个身份矩阵,我想以一种特定的方式合并。例如,如果我有两个矩阵,如:Python 以特定的方式合并单位矩阵,python,numpy,matrix,Python,Numpy,Matrix,我有两个身份矩阵,我想以一种特定的方式合并。例如,如果我有两个矩阵,如: [i 0] [j 0] [0 i] and [0 j] 我想在列之间交替挤压它们,得到如下结果: [i j 0 0] [0 0 i j] array([[ 1.2, 1.3, 0. , 0. ], [ 0. , 0. , 1.2, 1.3]]) 不管怎么说,要用numpy做这个?因此,对于这样的数据: size = 2 i = 1.2 j = 1.3 m1 = np.eye(size)
[i 0] [j 0]
[0 i] and [0 j]
我想在列之间交替挤压它们,得到如下结果:
[i j 0 0]
[0 0 i j]
array([[ 1.2, 1.3, 0. , 0. ],
[ 0. , 0. , 1.2, 1.3]])
不管怎么说,要用numpy做这个?因此,对于这样的数据:
size = 2
i = 1.2
j = 1.3
m1 = np.eye(size)*i
m2 = np.eye(size)*j
m1
>>>array([[ 1.2, 0. ],
[ 0. , 1.2]])
m2
>>>array([[ 1.3, 0. ],
[ 0. , 1.3]])
返回如下内容的函数:
[i j 0 0]
[0 0 i j]
array([[ 1.2, 1.3, 0. , 0. ],
[ 0. , 0. , 1.2, 1.3]])
您可以尝试以下方法:
np.hstack(map(np.transpose,map(np.vstack, zip(m1, m2))))
问题是-“…在列之间交替挤压它们”。所以,有了这个目标,你可以-
np.concatenate((m1,m2)).T.reshape(-1,m1.shape[0]).T
还是短一点的-
np.dstack((m1,m2)).reshape(m1.shape[0],-1)
样本运行-
In [273]: m1
Out[273]:
array([[48, 31, 36, 30, 15],
[27, 14, 14, 13, 30]])
In [274]: m2
Out[274]:
array([[42, 39, 29, 35, 17],
[31, 11, 39, 10, 28]])
In [275]: np.concatenate((m1,m2)).T.reshape(-1,m1.shape[0]).T
Out[275]:
array([[48, 42, 31, 39, 36, 29, 30, 35, 15, 17],
[27, 31, 14, 11, 14, 39, 13, 10, 30, 28]])
In [276]: np.dstack((m1,m2)).reshape(m1.shape[0],-1)
Out[276]:
array([[48, 42, 31, 39, 36, 29, 30, 35, 15, 17],
[27, 31, 14, 11, 14, 39, 13, 10, 30, 28]])
还有一个:
In [315]: out = np.zeros((size,2*size))
In [316]: out[:,0::2]=m1
In [317]: out[:,1::2]=m2
In [318]: out
Out[318]:
array([[ 1.2, 1.3, 0. , 0. ],
[ 0. , 0. , 1.2, 1.3]])
针对这个具体问题
np.kron(np.eye(2),[m1[0,0],m2[0,0]])
足够了,您可以在第二个参数中添加任意数量的参数。请添加一个0
s不匹配的示例(不同的值和预期结果)。优雅但非常缓慢。@JohnMoeller您是在开玩笑吧?它是2乘2。这个例子是2x2。如果OP真的希望始终对2x2矩阵进行操作,那么直接构造2x4矩阵就更容易了。假设OP想要在更大的东西上操作通常是好的。@JohnMoeller,这样你就可以在通用性方面击败kronecker产品了?