堆叠矩阵以使具有父矩阵的站点的矩阵映射为块对角线

时间:2018-02-20 17:51:43

标签: python numpy scipy

如何在python中如下堆叠矩阵,使得父矩阵的元素在子矩阵的相同块对角线位置处形成块对角线。 例: 我有四个矩阵AA,AB,BA,BB

我想按照附图中所示制作矩阵。Making out from AA,AB,BA,BB

1 个答案:

答案 0 :(得分:1)

In [35]: arr = np.arange(1,17).reshape(4,4)
In [36]: arr2 = arr.reshape(2,2,2,2)
In [37]: arr2
Out[37]: 
array([[[[ 1,  2],
         [ 3,  4]],

        [[ 5,  6],
         [ 7,  8]]],


       [[[ 9, 10],
         [11, 12]],

        [[13, 14],
         [15, 16]]]])

我做了一些试验和错误的转置想法,但没有得到任何地方。

但是让我们退一步尝试切片插入:

In [42]: out = np.zeros_like(arr)
In [43]: out[::2,::2]=arr2[0,0]
In [44]: out[::2,1::2]=arr2[0,1]
In [45]: out
Out[45]: 
array([[1, 5, 2, 6],
       [0, 0, 0, 0],
       [3, 7, 4, 8],
       [0, 0, 0, 0]])

这似乎是一个可行的解决方案。这可以放入循环(或2)。

In [50]: out = np.zeros_like(arr)
In [51]: for i,j in np.ndindex(2,2):
    ...:     out[i::2,j::2] = arr2[i,j]
    ...:     
In [52]: out
Out[52]: 
array([[ 1,  5,  2,  6],
       [ 9, 13, 10, 14],
       [ 3,  7,  4,  8],
       [11, 15, 12, 16]])

out拆分为4d数组可以帮助我们从Out[37]可视化转换:

In [57]: out.reshape(2,2,2,2)
Out[57]: 
array([[[[ 1,  5],
         [ 2,  6]],

        [[ 9, 13],
         [10, 14]]],


       [[[ 3,  7],
         [ 4,  8]],

        [[11, 15],
         [12, 16]]]])

但也许更明显的迭代解决方案足够快。

例如,这会创建正确的2x2块:

In [59]: arr2.transpose(0,2,3,1)
Out[59]: 
array([[[[ 1,  5],
         [ 2,  6]],

        [[ 3,  7],
         [ 4,  8]]],


       [[[ 9, 13],
         [10, 14]],

        [[11, 15],
         [12, 16]]]])

又一次交换:

In [62]: arr2.transpose(2,0,3,1).reshape(4,4)
Out[62]: 
array([[ 1,  5,  2,  6],
       [ 9, 13, 10, 14],
       [ 3,  7,  4,  8],
       [11, 15, 12, 16]])