numpy -更新双切片矩阵而不更新原始矩阵

lokaqttq  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(145)

我遇到了一个关于numpy矩阵的问题。给定一个矩阵A和一个索引列表L,我试图为索引列表中的每个i,j设置A[i,j] = 1
我有下面的代码部分:

A = np.array([
[0,0,0,0,0,0],

[0,0,1,0,0,0],

[0,1,0,1,1,0],

[0,0,1,0,0,0],

[0,0,1,0,0,1],

[0,0,0,0,1,0]])
 x=(A[2,:])
 indexes = np.where(x==1)[0]
 A[indexes,:][:,indexes] = 1
*** print(A[indexes,:][:,indexes])
 print(A)

行***不更新原始A中的值,而如果我用一个切片(A[indexes,:]=1)替换它,id会更改A
有人能解释一下两者之间的区别吗?我应该如何解决这个问题?

n6lpvg4x

n6lpvg4x1#

索引是一个简单的数组:

In [25]: indexes
Out[25]: array([1, 3, 4], dtype=int64)

使用双索引:

In [26]: A[indexes,:][:,indexes]
Out[26]: 
array([[0, 0, 0],
       [0, 0, 0],
       [0, 0, 0]])

这不能用于设置,因为A[index,:]copy,而不是view
可以使用ix_选取相同的图元。

In [28]: A[np.ix_(indexes,indexes)]
Out[28]: 
array([[0, 0, 0],
       [0, 0, 0],
       [0, 0, 0]])

使用它来设置元素:

In [29]: A[np.ix_(indexes,indexes)]=2

并检查:

In [30]: A[indexes,:][:,indexes]
Out[30]: 
array([[2, 2, 2],
       [2, 2, 2],
       [2, 2, 2]])

In [31]: A
Out[31]: 
array([[0, 0, 0, 0, 0, 0],
       [0, 2, 1, 2, 2, 0],
       [0, 1, 0, 1, 1, 0],
       [0, 2, 1, 2, 2, 0],
       [0, 2, 1, 2, 2, 1],
       [0, 0, 0, 0, 1, 0]])

执行与ix_相同的操作:

In [32]: A[indexes[:,None],indexes]
Out[32]: 
array([[2, 2, 2],
       [2, 2, 2],
       [2, 2, 2]])

https://numpy.org/doc/stable/user/basics.indexing.html

相关问题