numpy.block 重塑问题

numpy.block issue with reshaping

我已经被这个问题困扰了一段时间,如果有人能提供任何想法,我将不胜感激?

我有一个 numpy 数组,比如 A,形状为:(3, 3, 3, 3)。我想基本上使它成为一个二维数组,B 的形状: (9, 9) 同时以自然块顺序保留 A 的内容,即 A[0][0][:][:] 基本上是 3 x 3个子矩阵,也应该出现在B的左上部分。同理,A[2][2][:][:]应该出现在B的右下部分,依此类推。我附上了例子,以澄清。原始数组,A:

array([[[[ 0,  0,  0],
         [ 0,  0,  0],
         [ 0,  0,  0]],

        [[ 1,  1,  1],
         [ 1,  1,  1],
         [ 1,  1,  1]],

        [[ 2,  2,  2],
         [ 2,  2,  2],
         [ 2,  2,  2]]],


       [[[-1, -1, -1],
         [-1, -1, -1],
         [-1, -1, -1]],

        [[ 0,  0,  0],
         [ 0,  0,  0],
         [ 0,  0,  0]],

        [[ 1,  1,  1],
         [ 1,  1,  1],
         [ 1,  1,  1]]],


       [[[-2, -2, -2],
         [-2, -2, -2],
         [-2, -2, -2]],

        [[-1, -1, -1],
         [-1, -1, -1],
         [-1, -1, -1]],

        [[ 0,  0,  0],
         [ 0,  0,  0],
         [ 0,  0,  0]]]])

和所需的数组,B:

array([[ 0,  0,  0,  1,  1,  1,  2,  2,  2],
       [ 0,  0,  0,  1,  1,  1,  2,  2,  2],
       [ 0,  0,  0,  1,  1,  1,  2,  2,  2],
       [-1, -1, -1,  0,  0,  0,  1,  1,  1],
       [-1, -1, -1,  0,  0,  0,  1,  1,  1],
       [-1, -1, -1,  0,  0,  0,  1,  1,  1],
       [-2, -2, -2, -1, -1, -1,  0,  0,  0],
       [-2, -2, -2, -1, -1, -1,  0,  0,  0],
       [-2, -2, -2, -1, -1, -1,  0,  0,  0]])

您的输入有歧义。我可以使用以下方法复制它:

a = np.repeat(np.array([0,1,2,-1,0,1,-2,-1,0]), 9).reshape(3,3,3,3)

然后,交换轴并重塑得到:

a.swapaxes(1,2).reshape(9,9)

array([[ 0,  0,  0,  1,  1,  1,  2,  2,  2],
       [ 0,  0,  0,  1,  1,  1,  2,  2,  2],
       [ 0,  0,  0,  1,  1,  1,  2,  2,  2],
       [-1, -1, -1,  0,  0,  0,  1,  1,  1],
       [-1, -1, -1,  0,  0,  0,  1,  1,  1],
       [-1, -1, -1,  0,  0,  0,  1,  1,  1],
       [-2, -2, -2, -1, -1, -1,  0,  0,  0],
       [-2, -2, -2, -1, -1, -1,  0,  0,  0],
       [-2, -2, -2, -1, -1, -1,  0,  0,  0]])

但这可能不正确,具体取决于您希望每个 3x3 块在成为另一个 3x3 块时如何表现。

给定范围输入 0->80 (a = np.arange(3**4).reshape(3,3,3,3)):

array([[[[ 0,  1,  2],
         [ 3,  4,  5],
         [ 6,  7,  8]],

        [[ 9, 10, 11],
         [12, 13, 14],
         [15, 16, 17]],
...

这将得到:

array([[ 0,  1,  2,  9, 10, 11, 18, 19, 20],
       [ 3,  4,  5, 12, 13, 14, 21, 22, 23],
       [ 6,  7,  8, 15, 16, 17, 24, 25, 26],
       [27, 28, 29, 36, 37, 38, 45, 46, 47],
       [30, 31, 32, 39, 40, 41, 48, 49, 50],
       [33, 34, 35, 42, 43, 44, 51, 52, 53],
       [54, 55, 56, 63, 64, 65, 72, 73, 74],
       [57, 58, 59, 66, 67, 68, 75, 76, 77],
       [60, 61, 62, 69, 70, 71, 78, 79, 80]])

这是你想要的吗?