代码之家  ›  专栏  ›  技术社区  ›  kmario23 Mazdak

将要素地图(三维阵列)拆分为二维阵列

  •  3
  • kmario23 Mazdak  · 技术社区  · 6 年前

    假设我有一个形状的特征图(即3D阵列) (32, 32, 96)

    In [573]: feature_map = np.random.randint(low=0, high=255, size=(32, 32, 96))
    

    现在,我想分别可视化每个要素图。因此,我想提取每个正面切片(即一个2D形状数组 (32, 32) )所以应该有96个这样的特征图。

    可能的话,如何获取这些数组 不作为副本 为了节省内存?由于这只是为了可视化,因此 看法 够了!

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

    您可以使用 np.transpose 和切片操作(不创建阵列的副本):

    feature_map = np.random.randint(low=0, high=255, size=(32, 32, 96))
    feature_map = np.transpose(feature_map, axes=[2, 0, 1])
    for i in range(feature_map.shape[0]):
      print(feature_map[i].shape)  # a view of original array. shape=(32, 32)
    

    ... 或者只进行切片:

    for i in range(feature_map.shape[2]):
      print(feature_map[:, :, i].shape)  # a view of original array. shape=(32, 32)
    
        2
  •  0
  •   kmario23 Mazdak    6 年前

    我也意识到 numpy.dsplit() 可以用于此类3D阵列,因为我们正在尝试沿深度方向拆分它。但是,我必须另外使用 np.squeeze() 消除第三维。此外,根据我的案例需要,它还返回 看法 阵列的。

    # splitting it into 96 slices in one-go!
    In [659]: np.dsplit(feature_map, feature_map.shape[-1])
    
    In [660]: np.dsplit(feature_map, feature_map.shape[-1])[10].flags
    Out[660]: 
      C_CONTIGUOUS : False
      F_CONTIGUOUS : False
      OWNDATA : False   #<============== NO copy is made
      WRITEABLE : True
      ALIGNED : True
      UPDATEIFCOPY : False
    
    In [661]: np.dsplit(feature_map, feature_map.shape[-1])[10].shape
    Out[661]: (32, 32, 1)
    
    # getting rid of unitary dimension with `np.squeeze`
    In [662]: np.squeeze(np.dsplit(feature_map, feature_map.shape[-1])[10]).shape
    Out[662]: (32, 32)
    
    In [663]: np.squeeze(np.dsplit(feature_map, feature_map.shape[-1])[10]).flags
    Out[663]: 
      C_CONTIGUOUS : False
      F_CONTIGUOUS : False
      OWNDATA : False   #<============== NO copy is made
      WRITEABLE : True
      ALIGNED : True
      UPDATEIFCOPY : False
    
        3
  •  0
  •   ascripter    6 年前
    import numpy as np
    
    def do_something(array_slice):
        print array_slice
    
    feature_map = np.random.randint(low=0, high=255, size=(3, 3, 9))
    
    # loop over the indices of the last dimension of the array (i.e. 0 to 8)
    for level in range(feature_map.shape[2]):
        # now take only the 2d-slice of the first two dimensions at the height of 'level'
        do_something(feature_map[:,:,level])
    
    # you could also take a slice from another dimension
    for level in range(feature_map.shape[1]):    
        do_something(feature_map[:,level,:])