Numpy双重切片赋值无法更新原矩阵问题求助
Numpy 多维索引赋值不生效的原因与解决办法
两种赋值操作的核心差异
单切片赋值(A[indexes,:] = 1)
这种方式直接对原数组的目标位置进行赋值。即便使用了整数数组索引(高级索引),赋值操作会直接定位到原数组内存中对应的区域,修改的是原数组本身,因此能看到原数组的变化。
链式切片赋值(A[indexes,:][:,indexes] = 1)
这是两步独立的索引操作:
- 第一步
A[indexes,:]会生成原数组的副本(整数数组索引属于高级索引,返回的是独立于原数组的副本,而非视图); - 第二步
[:,indexes]是对这个临时副本做切片,赋值操作仅作用于该副本,完全不会影响原数组A。这就是打印原数组时看不到变化的原因。
解决办法:一次性索引定位目标位置
要直接修改原数组中所有(i,j)属于indexes的位置,需要用一次性的二维高级索引,同时指定行和列的索引,避免生成中间副本。有两种常用方式:
方式1:用np.newaxis扩展索引维度
通过扩展行索引的维度,让Numpy自动广播生成二维索引网格:
A[indexes[:, np.newaxis], indexes] = 1
方式2:用np.ix_构建索引网格
np.ix_会将一维索引数组转换为能选中二维网格的索引对,代码更直观:
A[np.ix_(indexes, indexes)] = 1
修改后的完整代码
import numpy as np 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] # 使用np.ix_实现正确赋值 A[np.ix_(indexes, indexes)] = 1 print(A[indexes,:][:,indexes]) print(A)
运行这段代码后,原数组A中所有(i,j)属于indexes的位置都会被设为1,符合需求。
内容的提问来源于stack exchange,提问作者Niv Peretz
相关产品推荐
相关产品推荐

