【问题标题】:How to split a matrix into 4 blocks using numpy?如何使用 numpy 将矩阵拆分为 4 个块?
【发布时间】:2012-06-21 18:03:40
【问题描述】:

我正在使用 python 实现 Strassen 的矩阵乘法。在划分步骤中,我们将较大的矩阵划分为较小的子矩阵。是否有内置的 numpy 函数来拆分矩阵?

【问题讨论】:

    标签: python matrix numpy split strassen


    【解决方案1】:

    根据this answer,您可以使用swapaxes

    你可以创建一个辅助方法:

    def split(array, nrows, ncols):
        """Split a matrix into sub-matrices."""
    
        r, h = array.shape
        return (array.reshape(h//nrows, nrows, -1, ncols)
                     .swapaxes(1, 2)
                     .reshape(-1, nrows, ncols))
    

    这是一个使用它的例子

    import numpy as np
    
    array = np.array([
        [1, 1, 2, 2],
        [3, 3, 4, 4],
        [5, 5, 6, 6],
        [7, 7, 8, 8]])
    
    A, B, C, D =  split(array, 2, 2)
    # A = 
    # [[1 1]
    #  [3 3]]
    
    # B = 
    # [[2 2]
    #  [4 4]]
    
    # C = 
    # [[5 5]
    #  [7 7]]
    
    # D =
    # [[6 6]
    #  [8 8]]
    print('A = \n{}\n\n'
          'B = \n{}\n\n'
          'C = \n{}\n\n'
          'D =\n{}'.format(A, B, C, D))
    

    【讨论】:

      【解决方案2】:

      不完全是,但使用数组切片表示法,您应该可以很容易地自己完成。

      >>> A = np.linspace(0,24,25).reshape([5,5,])
      >>> A
      array([[  0.,   1.,   2.,   3.,   4.],
             [  5.,   6.,   7.,   8.,   9.],
             [ 10.,  11.,  12.,  13.,  14.],
             [ 15.,  16.,  17.,  18.,  19.],
             [ 20.,  21.,  22.,  23.,  24.]])
      

      使 B 成为 A 中左上角的 2x2:

      >>> B = A[0:2,0:2]
      

      注意B是一个视图,它与A共享数据

      >>> B[1,1] = 60
      >>> print A
      [[  0.   1.   2.   3.   4.]
       [  5.  60.   7.   8.   9.]
       [ 10.  11.  12.  13.  14.]
       [ 15.  16.  17.  18.  19.]
       [ 20.  21.  22.  23.  24.]]
      

      如果需要从A复制数据,使用copy方法:

      >>> B = A[0:2,0:2].copy()
      >>> B
      array([[  0.,   1.],
             [  5.,  60.]])
      >>> B[1,1] = 600
      >>> B
      array([[   0.,    1.],
             [   5.,  600.]])
      >>> A
      array([[  0.,   1.,   2.,   3.,   4.],
             [  5.,  60.,   7.,   8.,   9.],
             [ 10.,  11.,  12.,  13.,  14.],
             [ 15.,  16.,  17.,  18.,  19.],
             [ 20.,  21.,  22.,  23.,  24.]])
      

      【讨论】:

        【解决方案3】:

        我遇到了同样的问题,发现一些内置的 numpy 函数可以将我的矩阵拆分为 4 个子矩阵(我的矩阵大小为 2^N*2^N)

        这是我写的代码:

        upper_half = np.hsplit(np.vsplit(my_matrix, 2)[0], 2)
        lower_half = np.hsplit(np.vsplit(my_matrix, 2)[1], 2)
        
        upper_left = upper_half[0]
        upper_right = upper_half[1]
        lower_left = lower_half[0]
        lower_right = lower_half[1]
        

        使用 numpy 重新组合它们的好处:

        C=np.vstack([np.hstack([c11, c12]), np.hstack([c21, c22])])
        

        vsplit hsplit hstack 和 vstack 似乎是为此目的而制作的

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-02-23
          • 1970-01-01
          • 1970-01-01
          • 2021-08-17
          • 2014-11-09
          • 2015-03-16
          • 1970-01-01
          相关资源
          最近更新 更多