用numpy中的另一个小矩阵替换矩阵的子部分

时间:2014-10-22 11:17:39

标签: python numpy matrix

我是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

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

4 个答案:

答案 0 :(得分:13)

以下是如何做到这一点:

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

答案 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. ]])   

答案 2 :(得分:1)

通常,例如,对于非连续的行/列 使用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 :(得分:1)

以下功能矩阵的任意任意非连续部分替换为另一个矩阵。

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数组ind1的索引[1,3] x [0,3](即ind2 x x)替换为2 x 2数组{{1} }的4个不同值:

y