从3D Matrix中提取补丁

时间:2017-01-11 08:12:41

标签: python numpy tensorflow

我有尺寸A的3D矩阵h x w x c。我想从每个“渠道”ph x pw中提取维度c的补丁。 ph分为hpw除以w。在这个例子中,

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

Example

我知道如何使用gather_nd在tensorflow中执行此操作,但我希望在设置它时能提高效率,因为维度很大,我宁愿没有{的数组{ {1}}在记忆中。可能有一个聪明的重塑? numpy或tensorflow解决方案都非常好!

1 个答案:

答案 0 :(得分:4)

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

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]]])