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产品了?