简体   繁体   English

Python中的块矩阵赋值

[英]block matrix assignment in Python

From this mwe: 从这个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]

I get: 我明白了:

>>> c
matrix([[ 4.,  7.],
        [ 0.,  9.]])

and: 和:

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

I do not understand why the values of a remain zeroes. 我不明白为什么值保持零。 If a similar operation is done in two steps, everything works fine: 如果通过两个步骤完成类似的操作,一切正常:

>>> for k in range(len(indice)):
...     a[indice[k],indice]=b[k,:]

I obtain: 我获得:

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

It's because a[indice,:][:,indice] isn't a view into the array but is a separate copy - 这是因为a[indice,:][:,indice]不是数组的视图,而是一个单独的副本 -

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

To solve it, we can use np.ix_ - 要解决它,我们可以使用np.ix_ -

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

Verify result - 验证结果 -

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM