【问题标题】:Interlace various small 2D matrices into a bigger one将各种小的二维矩阵交错成一个更大的矩阵
【发布时间】:2017-08-11 01:39:16
【问题描述】:

我有一些小矩阵,我想将它们交织成一个更大的矩阵。例如,假设我有 4 个 4x4 矩阵(尽管我正在寻找的解决方案也应该适用于非方形 2D 矩阵)并且我想结合它们的结果来构建一个 8x8 矩阵,如下所示:

我得到小矩阵的顺序告诉我它们的元素在更大矩阵中的位置。

我想我可以逐个值迭代并一遍又一遍地计算新索引,但我确信必须有一种更有效的方法来做到这一点。

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    方法#1

    为了提高性能,我建议初始化输出数组,然后用切片分配给它,就像这样 -

    A = [a0,a1,a2,a3] # Input list of arrays
    
    m,n = A[0].shape
    out = np.empty((2*m,2*n),dtype=A[0].dtype)
    out[::2,::2] = A[0]
    out[::2,1::2] = A[1]
    out[1::2,::2] = A[2]
    out[1::2,1::2] = A[3]
    

    示例运行 -

    1) 输入:

    In [67]: a0
    Out[67]: 
    array([[92, 65, 41, 14],
           [31, 95, 79, 77],
           [98, 89, 26, 68],
           [63, 91, 23, 74]])
    
    In [68]: a1
    Out[68]: 
    array([[67, 13, 43, 25],
           [18, 15, 38, 34],
           [13, 59, 46, 89],
           [11, 68, 81, 11]])
    
    In [69]: a2
    Out[69]: 
    array([[12, 53, 81, 91],
           [88, 83, 77, 98],
           [63, 53, 56, 76],
           [58, 64, 57, 68]])
    
    In [70]: a3
    Out[70]: 
    array([[21, 82, 88, 49],
           [54, 53, 62, 80],
           [89, 96, 72, 62],
           [81, 93, 41, 84]])
    

    2) 输出:

    In [72]: out
    Out[72]: 
    array([[92, 67, 65, 13, 41, 43, 14, 25],
           [12, 21, 53, 82, 81, 88, 91, 49],
           [31, 18, 95, 15, 79, 38, 77, 34],
           [88, 54, 83, 53, 77, 62, 98, 80],
           [98, 13, 89, 59, 26, 46, 68, 89],
           [63, 89, 53, 96, 56, 72, 76, 62],
           [63, 11, 91, 68, 23, 81, 74, 11],
           [58, 81, 64, 93, 57, 41, 68, 84]])
    

    方法 #2

    我们也可以使用np.concatenate 将它们堆叠成一个数组,然后转置并最终整形为预期的(2*m,2*n) 形状的数组,就像这样 -

    np.concatenate((A)).reshape(2,2,m,n).transpose(2,0,3,1).reshape(2*m,2*n)
    

    【讨论】:

    • 另外,我认为vstack/hstack/dstack 也可以做到这一点。
    • @Wolph 好建议!好吧,他们都使用np.concatenate。所以,从性能上看,我看不到那里的动机。
    • 我不知道。继续:)
    • @Divakar 有趣!我喜欢您在第一种方法中的解决方案。但是,为什么我们需要将它们放在列表中?我们可以只使用数组本身..
    • @kmario23 好吧,我不知道如何输入输入。我方便的假设是使用数组列表,但本质上它应该暗示你一一建议。
    猜你喜欢
    • 2015-06-06
    • 2014-10-16
    • 2020-03-19
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    相关资源
    最近更新 更多