代码之家  ›  专栏  ›  技术社区  ›  JDS

python numpy如何将数组/图像列表重塑为拼贴画?

  •  0
  • JDS  · 技术社区  · 6 年前

    我有以下25个代表图案的黑白迷你图像列表:

    imgs.shape

    (25, 3, 3, 1)

    也就是说,有25种不同的3x3黑白图像模式。我想做的是创建一个大图像 5x5 其中 3x3 布洛克,这有道理吗?有点像下面这样:

    enter image description here

    我的目的是要有一些形状 (15, 15, 1) 我可以这样展示和观看。我在python中使用numpy和opencv。希望做一些对实时处理非常有效的事情,所以我认为numpy的重塑可能是有意义的。

    谢谢你的帮助!

    1 回复  |  直到 6 年前
        1
  •  3
  •   hilberts_drinking_problem    6 年前

    解决方案:

    imgs.reshape(5, 5, 3, 3, 1).swapaxes(1, 2).reshape(15, 15, 1)
    

    示例:

    # test data 
    # each 3x3 image consists of the 9 identical digits
    
    A = np.stack([
        np.full((3, 3, 1), i)
        for i in range(1, 26)
    ])
    
    with_swap = A.reshape(5, 5, 3, 3, 1).swapaxes(1, 2).reshape(15, 15, 1)
    print(with_swap[...,-1])
    
    without_swap = A.reshape(15, 15, 1)
    print(without_swap[...,-1])
    

    有交换:

    [[ 1  1  1  2  2  2  3  3  3  4  4  4  5  5  5]
     [ 1  1  1  2  2  2  3  3  3  4  4  4  5  5  5]
     [ 1  1  1  2  2  2  3  3  3  4  4  4  5  5  5]
     [ 6  6  6  7  7  7  8  8  8  9  9  9 10 10 10]
     [ 6  6  6  7  7  7  8  8  8  9  9  9 10 10 10]
     [ 6  6  6  7  7  7  8  8  8  9  9  9 10 10 10]
     [11 11 11 12 12 12 13 13 13 14 14 14 15 15 15]
     [11 11 11 12 12 12 13 13 13 14 14 14 15 15 15]
     [11 11 11 12 12 12 13 13 13 14 14 14 15 15 15]
     [16 16 16 17 17 17 18 18 18 19 19 19 20 20 20]
     [16 16 16 17 17 17 18 18 18 19 19 19 20 20 20]
     [16 16 16 17 17 17 18 18 18 19 19 19 20 20 20]
     [21 21 21 22 22 22 23 23 23 24 24 24 25 25 25]
     [21 21 21 22 22 22 23 23 23 24 24 24 25 25 25]
     [21 21 21 22 22 22 23 23 23 24 24 24 25 25 25]]
    

    不交换:

    [[ 1  1  1  1  1  1  1  1  1  2  2  2  2  2  2]
     [ 2  2  2  3  3  3  3  3  3  3  3  3  4  4  4]
     [ 4  4  4  4  4  4  5  5  5  5  5  5  5  5  5]
     [ 6  6  6  6  6  6  6  6  6  7  7  7  7  7  7]
     [ 7  7  7  8  8  8  8  8  8  8  8  8  9  9  9]
     [ 9  9  9  9  9  9 10 10 10 10 10 10 10 10 10]
     [11 11 11 11 11 11 11 11 11 12 12 12 12 12 12]
     [12 12 12 13 13 13 13 13 13 13 13 13 14 14 14]
     [14 14 14 14 14 14 15 15 15 15 15 15 15 15 15]
     [16 16 16 16 16 16 16 16 16 17 17 17 17 17 17]
     [17 17 17 18 18 18 18 18 18 18 18 18 19 19 19]
     [19 19 19 19 19 19 20 20 20 20 20 20 20 20 20]
     [21 21 21 21 21 21 21 21 21 22 22 22 22 22 22]
     [22 22 22 23 23 23 23 23 23 23 23 23 24 24 24]
     [24 24 24 24 24 24 25 25 25 25 25 25 25 25 25]]