从这个mwe:

a=np.zeros((5,5))
b=np.zeros((2,2))
a=np.matrix(a)
b=np.matrix(b)
b[0,0]=4
b[1,1]=9
b[0,1]=7
indice=[2,3]
# 1
c=a[indice,:][:,indice]
c=b
print c
# 2
a[indice,:][:,indice]=b
print a[indice,:][:,indice]

我得到:
>>> c
matrix([[ 4.,  7.],
        [ 0.,  9.]])

和:
>>> a[indice,:][:,indice]
matrix([[ 0.,  0.],
        [ 0.,  0.]])

我不明白为什么 的值仍然为零。如果类似的操作分两步完成,则一切正常:
>>> for k in range(len(indice)):
...     a[indice[k],indice]=b[k,:]

我获得:
>>> a
matrix([[ 0.,  0.,  0.,  0.,  0.],
        [ 0.,  4.,  0.,  7.,  0.],
        [ 0.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  9.,  0.],
        [ 0.,  0.,  0.,  0.,  0.]])

最佳答案

这是因为 a[indice,:][:,indice] 不是数组的 View ,而是一个单独的副本 -

In [142]: np.may_share_memory(a, a[indice,:][:,indice])
Out[142]: False

要解决它,我们可以使用 np.ix_ -
a[np.ix_(indice, indice)] = b

验证结果 -
In [145]: a
Out[145]:
matrix([[ 0.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  0.]])

In [146]: b
Out[146]:
matrix([[ 4.,  7.],
        [ 0.,  9.]])

In [147]: a[np.ix_(indice, indice)] = b

In [148]: a
Out[148]:
matrix([[ 0.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  4.,  7.,  0.],
        [ 0.,  0.,  0.,  9.,  0.],
        [ 0.,  0.,  0.,  0.,  0.]])

In [149]: a[indice,:][:,indice]
Out[149]:
matrix([[ 4.,  7.],
        [ 0.,  9.]])

关于python - Python中的块矩阵分配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44262891/

10-12 22:26