本文介绍了Python中的块矩阵分配的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

通过此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.]])

我不明白为什么 a 的值保持为零.如果分两步完成类似的操作,则一切正常:

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,:]

我获得:

>>> 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]不是数组的视图,而是单独的副本-

It's because a[indice,:][:,indice] isn't a view into the array but is a separate copy -

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


要解决此问题,我们可以使用 np.ix_ -


To solve it, we can use 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中的块矩阵分配的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

06-29 15:53