【问题标题】:Numpy blocks reshapingNumpy 块重塑
【发布时间】:2020-11-09 13:48:32
【问题描述】:

我正在寻找一种方法来重塑以下 1d-numpy 数组:

# dimensions
n = 2 # int : 1 ... N
h = 2 # int : 1 ... N
m = n*(2*h+1)

input_data = np.arange(0,(n*(2*h+1))**2)

预期的输出应该重新整形为(2*h+1)**2 形状为(n,n) 的块,例如:

input_data.reshape(((2*h+1)**2,n,n))
>>> array([[[ 0  1]
            [ 2  3]]

           [[ 4  5]
            [ 6  7]]
              ...

           [[92 93]
            [94 95]]

           [[96 97]
            [98 99]]]

这些块最终需要重新塑造成一个(m,m)矩阵,以便它们堆叠成一行2*h+1块:

>>> array([[ 0,  1,  4,  5,  8,  9, 12, 13, 16, 17],
           [ 2,  3,  6,  7, 10, 11, 14, 15, 18, 19],
                              ...
           [80, 81, 84, 85, 88, 89, 92, 93, 96, 97],
           [82, 83, 86, 87, 90, 91, 94, 95, 98, 99]])

我的问题是,在第一次重塑为 (n,n) 块后,我似乎无法找到正确的轴排列。我查看了几个答案,例如this one,但都是徒劳的。

由于nh 的实际尺寸相当大,并且此操作在迭代过程中进行,因此我正在寻找一种有效的整形操作。

【问题讨论】:

    标签: python numpy reshape


    【解决方案1】:

    我认为你不能单独使用 reshapetranspose 来做到这一点(尽管我很想被证明是错误的)。使用np.block 可以,但是有点乱:

    np.block([list(i) for i in input_data.reshape( (2*h+1), (2*h+1), n, n )])
    
    array([[ 0,  1,  4,  5,  8,  9, 12, 13, 16, 17],
           [ 2,  3,  6,  7, 10, 11, 14, 15, 18, 19],
           [20, 21, 24, 25, 28, 29, 32, 33, 36, 37],
           [22, 23, 26, 27, 30, 31, 34, 35, 38, 39],
           [40, 41, 44, 45, 48, 49, 52, 53, 56, 57],
           [42, 43, 46, 47, 50, 51, 54, 55, 58, 59],
           [60, 61, 64, 65, 68, 69, 72, 73, 76, 77],
           [62, 63, 66, 67, 70, 71, 74, 75, 78, 79],
           [80, 81, 84, 85, 88, 89, 92, 93, 96, 97],
           [82, 83, 86, 87, 90, 91, 94, 95, 98, 99]])
    

    编辑:没关系,你可以不用np.block

    input_data.reshape( (2*h+1), (2*h+1), n, n).transpose(0, 2, 1, 3).reshape(10, 10)
    
    array([[ 0,  1,  4,  5,  8,  9, 12, 13, 16, 17],
           [ 2,  3,  6,  7, 10, 11, 14, 15, 18, 19],
           [20, 21, 24, 25, 28, 29, 32, 33, 36, 37],
           [22, 23, 26, 27, 30, 31, 34, 35, 38, 39],
           [40, 41, 44, 45, 48, 49, 52, 53, 56, 57],
           [42, 43, 46, 47, 50, 51, 54, 55, 58, 59],
           [60, 61, 64, 65, 68, 69, 72, 73, 76, 77],
           [62, 63, 66, 67, 70, 71, 74, 75, 78, 79],
           [80, 81, 84, 85, 88, 89, 92, 93, 96, 97],
           [82, 83, 86, 87, 90, 91, 94, 95, 98, 99]])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-09
      • 2015-05-07
      • 2021-01-08
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      • 2016-02-10
      相关资源
      最近更新 更多