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

从3D矩阵中提取面片

  •  7
  • fabian789  · 技术社区  · 8 年前

    我有一个3D矩阵 A 尺寸 h x w x c .我想提取维度的补丁 ph x pw 从每个“通道” c . ph 分开 h pw 分开 w 在该示例中,

    h x w x c = 4 x 4 x 3
    ph x pw = 2 x 2
    

    Example

    我知道如何在tensorflow中使用 gather_nd 但我希望在设置它方面有更有效的方法,因为维度会很大,我不希望索引数组 聚集 在内存中。可能有智能重塑吗?无论是numpy还是tensorflow解决方案都会非常好!

    1 回复  |  直到 8 年前
        1
  •  4
  •   Divakar    8 年前

    您可以使用一些轴的重塑和交换-

    A.reshape(h//ph,ph,w//pw,pw,-1).swapaxes(1,2)
    

    样本运行-

    In [46]: # Sample inputs
        ...: h,w,c = 10,12,3
        ...: ph, pw = 2,2
        ...: A = np.random.randint(0,9,(h,w,c))
        ...: 
    
    In [47]: A.reshape(h//ph,ph,w//pw,pw,-1).swapaxes(1,2).shape
    Out[47]: (5, 6, 2, 2, 3)
    

    沿前两个轴的每个元素(作为块)表示面片。因此对于提供的样本,我们将 5 x 6 = 30 补丁。

    如果希望这些面片沿着一个合并的第一个轴,请使用一个或多个面片 reshape -

    In [85]: out = A.reshape(h//ph,ph,w//pw,pw,-1).swapaxes(1,2).reshape(-1,ph,pw,c)
    
    In [86]: out.shape
    Out[86]: (30, 2, 2, 3)
    

    让我们通过手动检查值本身进行验证-

    In [81]: A[:ph,:pw] # First patch
    Out[81]: 
    array([[[6, 5, 2],
            [4, 0, 1]],
    
           [[0, 0, 4],
            [2, 3, 0]]])
    
    In [82]: A[:ph,pw:2*pw] # Second patch
    Out[82]: 
    array([[[8, 3, 3],
            [0, 0, 2]],
    
           [[8, 5, 4],
            [3, 4, 6]]])
    
    In [83]: out[0]
    Out[83]: 
    array([[[6, 5, 2],
            [4, 0, 1]],
    
           [[0, 0, 4],
            [2, 3, 0]]])
    
    In [84]: out[1]
    Out[84]: 
    array([[[8, 3, 3],
            [0, 0, 2]],
    
           [[8, 5, 4],
            [3, 4, 6]]])
    
    推荐文章