【问题标题】:Replace sub part of matrix by another small matrix in numpy用numpy中的另一个小矩阵替换矩阵的子部分
【发布时间】:2014-12-17 19:54:08
【问题描述】:

我是 Numpy 的新手,想替换矩阵的一部分。比如我有两个矩阵,A,B由numpy生成

In [333]: A = ones((5,5))

In [334]: A
Out[334]: 
array([[ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.]])

In [335]: B
Out[335]: 
array([[ 0.1,  0.2],
       [ 0.3,  0.4]])

最终,我想让 A 成为以下矩阵。

In [336]: A
Out[336]: 
array([[ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  0.1,  0.2],
       [ 1.,  1.,  1.,  0.3,  0.4]])

和/或以下

In [336]: A
Out[336]: 
array([[ 1.,  1.,  1.,  0.1,  0.2],
       [ 1.,  1.,  1.,  0.3,  0.4],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.,  1.]])

我尝试了以下方法,但没有成功。我现在没有任何想法:(

A[[0,1],:][:,[3,4]] = B

甚至我都试过了

A[[0,1],:][:,[3,4]] = 1

检查四个单元格是否改变。你有什么想法吗?

【问题讨论】:

    标签: python numpy matrix


    【解决方案1】:

    你可以这样做:

    >>> A[3:5, 3:5] = B
    >>> A
    array([[ 1. ,  1. ,  1. ,  1. ,  1. ],
           [ 1. ,  1. ,  1. ,  1. ,  1. ],
           [ 1. ,  1. ,  1. ,  1. ,  1. ],
           [ 1. ,  1. ,  1. ,  0.1,  0.2],
           [ 1. ,  1. ,  1. ,  0.3,  0.4]])
    

    【讨论】:

    • 对于不连续的行/列呢?即,如果 OP 想要 A[[0,3],:][:,[3,4]] 怎么办?
    【解决方案2】:

    一般来说,例如,对于不连续的行/列 使用numpy.putmask(a, mask, values)(设置a.flat[n] = values[n] for each n where mask.flat[n]==True

    例如

    In [1]: a = np.zeros((3, 3))
    Out [1]: a
    array([[0., 0., 0.],
           [0., 0., 0.],
           [0., 0., 0.]])
    
    In [2]: values = np.ones((2, 2))
    Out [2]: values
    array([[1., 1.],
           [1., 1.]])
    
    In [3]: mask = np.zeros((3, 3), dtype=bool)
    In [4]: mask[0,0] = mask[0,1] = mask[1,1] = mask[2,2] = True
    
    Out [4]: mask
    array([[ True,  True, False],
           [False,  True, False],
           [False, False,  True]])
    
    In [5] np.putmask(a, mask, values)
    Out [5] a
    array([[1., 1., 0.],
           [0., 1., 0.],
           [0., 0., 1.]])
    

    【讨论】:

      【解决方案3】:

      对于第一个:

      In [13]: A[-B.shape[0]:, -B.shape[1]:] = B                              
      
      In [14]: A
      Out[14]: 
      array([[ 1. ,  1. ,  1. ,  1. ,  1. ],                                  
             [ 1. ,  1. ,  1. ,  1. ,  1. ],                                  
             [ 1. ,  1. ,  1. ,  1. ,  1. ],                                  
             [ 1. ,  1. ,  1. ,  0.1,  0.2],                                  
             [ 1. ,  1. ,  1. ,  0.3,  0.4]])   
      

      第二个:

      In [15]: A = np.ones((5,5))                                             
      
      In [16]: A[:B.shape[0], -B.shape[1]:] = B                               
      
      In [17]: A
      Out[17]: 
      array([[ 1. ,  1. ,  1. ,  0.1,  0.2],                                  
             [ 1. ,  1. ,  1. ,  0.3,  0.4],                                  
             [ 1. ,  1. ,  1. ,  1. ,  1. ],                                  
             [ 1. ,  1. ,  1. ,  1. ,  1. ],                                  
             [ 1. ,  1. ,  1. ,  1. ,  1. ]])   
      

      【讨论】:

        【解决方案4】:

        以下函数替换矩阵的任意不连续部分用另一个矩阵。

        def replace_submatrix(mat, ind1, ind2, mat_replace):
          for i, index in enumerate(ind1):
            mat[index, ind2] = mat_replace[i, :]
          return mat
        

        现在是应用程序的示例。我们将空的 4 x 4 数组 x 的索引 [1, 3] x [0, 3](即 ind1 x ind2)替换为 4 个不同值的 2 x 2 数组 y

        x = np.full((4, 4), 0)
        x
        array([[0, 0, 0, 0],
               [0, 0, 0, 0],
               [0, 0, 0, 0],
               [0, 0, 0, 0]])
        
        y = np.array([[1, 2], [5, 9]])
        y
        array([[1, 2],
               [5, 9]])
        
        ind1 = [1, 3]
        ind2 = [0, 3]
        res = replace_submatrix(x, ind1, ind2, y)  
        res  
        array([[0, 0, 0, 0],
               [1, 0, 0, 2],
               [0, 0, 0, 0],
               [5, 0, 0, 9]])
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-05-09
          • 2014-02-28
          • 2016-09-10
          • 1970-01-01
          • 1970-01-01
          • 2017-02-10
          • 2020-08-08
          相关资源
          最近更新 更多