【问题标题】:separating 2d numpy array into nxn chunks将 2d numpy 数组分成 nxn 个块
【发布时间】:2020-04-08 06:14:17
【问题描述】:

您如何将 2D numpy 数组分成 nxn 个块?

例如以下形状数组(4,4)

arr = [[1,2,3,4],
       [5,6,7,8],
       [9,10,11,12],
       [13,14,15,16]]

通过使用不同的 (2x2) 数组进行二次采样,转换为形状为 (4,2,2) 的数组:

new_arr = [[[1,2],
            [5,6]],
           [[3,4],
            [7,8]],
           [[9,10],
            [13,14]],
           [[11,12],
            [15,16]]]

【问题讨论】:

    标签: python arrays numpy slice


    【解决方案1】:

    您可以使用np.vsplit 将数组垂直拆分为多个子数组。同样,您可以使用np.hsplit 将数组水平拆分为多个子数组。为了更好地理解这一点,请检查使用 np.vsplitnp.hsplit 方法的通用 resample 函数。

    使用这个:

    def ressample(arr, N):
        A = []
        for v in np.vsplit(arr, arr.shape[0] // N):
            A.extend([*np.hsplit(v, arr.shape[0] // N)])
        return np.array(A)
    

    示例 1: 给定的 2D 数组的形状为 4x4,我们希望将其子采样到形状为 2x2 的块中。

    arr = np.array([[1, 2, 3, 4],
                    [5, 6, 7, 8],
                    [9, 10, 11, 12],
                    [13, 14, 15, 16]])  
    print(ressample(arr, 2)) #--> chunk size 2
    

    输出 1:

    [[[ 1  2]
      [ 5  6]]
    
     [[ 3  4]
      [ 7  8]]
    
     [[ 9 10]
      [13 14]]
    
     [[11 12]
      [15 16]]]
    

    示例 2: 考虑给定的二维数组包含 8 行和 8 列。现在我们将这个数组二次采样成 4x4 形状的块。

    arr = np.random.randint(0, 10, 64).reshape(8, 8)   
    print(ressample(arr, 4)) #--> chunck size 4
    

    示例输出 2:

    [[[8 3 7 5]
      [7 2 6 1]
      [7 9 2 2]
      [3 1 8 8]]
    
     [[2 0 3 2]
      [2 9 0 8]
      [2 6 3 9]
      [2 4 4 8]]
    
     [[9 9 1 8]
      [9 1 5 0]
      [8 5 1 2]
      [2 7 5 1]]
    
     [[7 8 9 6]
      [9 0 9 5]
      [8 9 8 3]
      [7 3 6 3]]]
    

    【讨论】:

      【解决方案2】:

      您可以执行以下操作,并将其调整为您的数组:

      import numpy as np
      
      arr = [[1,2,3,4],
             [5,6,7,8],
             [9,10,11,12],
             [13,14,15,16]]
      
      arr_new = np.array([[arr[i][j:j+2], arr[i+1][j:j+2]] for j in range(len(arr[0])-2) for i in range(len(arr)-2)])
      print(arr_new)
      print(arr_new.shape)
      

      这给出了以下输出:

      [[[ 1  2]
        [ 5  6]]
      
       [[ 5  6]
        [ 9 10]]
      
       [[ 2  3]
        [ 6  7]]
      
       [[ 6  7]
        [10 11]]]
      (4, 2, 2)
      

      【讨论】:

        【解决方案3】:

        您可以使用hsplit()vsplit() 方法来实现上述目的。

        import numpy as np
        
        arr = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])
        
        ls1,ls2 = np.hsplit(arr, 2)
        ls1 = np.vsplit(ls1,2)
        ls2 = np.vsplit(ls2,2)
        ls = ls1 + ls2
        result = np.array(ls)
        
        print(result)
        
        >>> 
         [[[ 1  2]
          [ 5  6]]
        
         [[ 9 10]
          [13 14]]
        
         [[ 3  4]
          [ 7  8]]
        
         [[11 12]
          [15 16]]]
        
        print(result.tolist())
        
        >>> [[[1, 2], [5, 6]], [[9, 10], [13, 14]], [[3, 4], [7, 8]], [[11, 12], [15, 16]]]
        
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-19
          • 1970-01-01
          • 2022-08-16
          • 2013-08-28
          • 2019-03-02
          • 1970-01-01
          • 2012-12-23
          相关资源
          最近更新 更多